Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用不同的参数模拟相同的方法_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 用不同的参数模拟相同的方法

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, "

我正在使用mockito测试我的业务服务,它使用了一个我想要模拟的实用程序。对于具有不同参数的实用程序,每个服务方法中至少有2-3个调用

当(…)时,是否有推荐的方法使用多个
。然后返回(…)
,用于相同的方法但不同的参数

我还想在内部使用
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来解决它吗。是否可以使用自定义匹配器解决此问题?