Java 用不同的参数模拟相同的方法
我正在使用mockito测试我的业务服务,它使用了一个我想要模拟的实用程序。对于具有不同参数的实用程序,每个服务方法中至少有2-3个调用 当(…)时,是否有推荐的方法使用多个Java 用不同的参数模拟相同的方法,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我正在使用mockito测试我的业务服务,它使用了一个我想要模拟的实用程序。对于具有不同参数的实用程序,每个服务方法中至少有2-3个调用 当(…)时,是否有推荐的方法使用多个。然后返回(…),用于相同的方法但不同的参数 我还想在内部使用any()marcher。可能吗 更新:示例代码 @Test public void myTest() { when(service.foo(any(), new ARequest(1, "A"))).thenReturn(new AResponse(1, "
。然后返回(…)
,用于相同的方法但不同的参数
我还想在内部使用any()
marcher。可能吗
更新:示例代码
@Test
public void myTest() {
when(service.foo(any(), new ARequest(1, "A"))).thenReturn(new AResponse(1, "passed"));
when(service.foo(any(), new ARequest(2, "2A"))).thenReturn(new AResponse(2, "passed"));
when(service.foo(any(), new BRequest(1, "B"))).thenReturn(new BResponse(112, "passed"));
c.execute();
}
public class ClassUnderTest {
Service service = new Service();
public void execute() {
AResponse ar = (AResponse) service.foo("A1", new ARequest(1, "A"));
AResponse ar2 = (AResponse) service.foo("A2", new ARequest(2, "2A"));
BResponse br = (BResponse) service.foo("B1", new BRequest(1, "B"));
}
}
public class Service {
public Object foo(String firstArgument, Object obj) {
return null; //return something
}
}
我认为:“推荐”的方式是适合你的;这需要最少的编码工作
您必须提供必要的规范,使您的测试能够完成它必须完成的任务。这是没有办法的
如果您真的关心所使用的参数,那么您必须相应地指定它们。如果你不在乎;使用
any()
正确的方法是使用eq()
匹配参数,但如果不想这样做,可以只记录多个返回值
when(someService.doSomething(any(SomeParam.class))).thenReturn(
firstReturnValue, secondReturnValue, thirdReturnValue
);
现在,第一个调用将返回
firstValue
,第二个secondValue
和所有后续thirdValue
一种方法是避免对参数限制过多,以便只使用一个然后返回调用来提供所有预期结果
例如,假设我想模拟此方法:
public String foo(String firstArgument, Object obj) {
return "Something";
}
然后,您可以通过提供任意多的结果来模拟它,如下所示:
// Mock the call of foo of any String to provide 3 results
when(mock.foo(anyString(), anyObject())).thenReturn("val1", "val2", "val3");
使用任何参数调用foo
将分别提供“val1
”、“val2
”,然后任何后续调用将提供“val3
”
如果您确实关心传递的值,但不想依赖于调用顺序,则可以使用然后使用answer
提供与第二个参数匹配的答案,就像您当前所做的那样,但与3个不同的然后使用return
when(mock.foo(anyString(), anyObject())).thenAnswer(
invocation -> {
Object argument = invocation.getArguments()[1];
if (argument.equals(new ARequest(1, "A"))) {
return new AResponse(1, "passed");
} else if (argument.equals(new ARequest(2, "2A"))) {
return new AResponse(2, "passed");
} else if (argument.equals(new BRequest(1, "B"))) {
return new BResponse(112, "passed");
}
throw new InvalidUseOfMatchersException(
String.format("Argument %s does not match", argument)
);
}
);
如果模拟方法只是为了验证传入的参数是否正确,则可以在模拟方法调用后使用any()和ArgumentCaptor进行验证。这是矛盾的。如果您指定了any()
,您是指any,但同时不指定?!?只要使用合适的匹配器。请向我推荐一些方法。我不能为其中一个参数创建对象,这就是为什么我使用any(),但我坚决不工作。我的意思是说我想做同样的事情。我还想在里面使用any()
marcher。有可能吗?对不起,你说的“里面”是什么意思?@ZeeshanBilal为什么?如果参数不相等,是否希望获得失败?因为在我的服务实现中,可能存在不同数量的参数组合。但我只想继续具体的论点。我认为这是确保内部步骤正确执行的方法。如果是这样,我不相信你能做得比你目前所做的更好。我可以使用自定义Matcher,它是增加了一些价值还是简化了我的问题?看起来很有趣,你能帮我通过自定义Matcher来解决它吗。是否可以使用自定义匹配器解决此问题?