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

新手上路,请多包涵

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

有没有推荐的方法使用多个 when(...).thenReturn(...) 相同的方法但不同的参数?

我也想在里面使用 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
  }
}

原文由 Zeeshan Bilal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

一种方法是避免对您的论点过于严格,以便仅通过一个 thenReturn 调用提供所有预期结果。

例如,假设我想模拟这个方法:

 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");

Calls to foo with any parameters will provide respectively “ val1 “, ” val2 “, then any subsequent calls will provide ” val3 “ .


如果您确实关心传递的值但不想依赖调用序列,您可以使用 thenAnswer 提供与第二个参数匹配的答案,就像您目前所做的那样,但有 3 个不同的 thenReturn 。假设您已经覆盖了方法 equals(Object o)

 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)
        );
    }
);

或者简单地说,使用方法 anyStringeq 作为参数游行者。假设您已经覆盖了方法 equals(Object o)

 when(service.foo(anyString(), eq(new ARequest(1, "A"))))
    .thenReturn(new AResponse(1, "passed"));
when(service.foo(anyString(), eq(new ARequest(2, "2A"))))
    .thenReturn(new AResponse(2, "passed"));
when(service.foo(anyString(), eq(new BRequest(1, "B"))))
    .thenReturn(new BResponse(112, "passed"));

原文由 Nicolas Filotto 发布,翻译遵循 CC BY-SA 4.0 许可协议

正确的方法是使用 eq() 匹配参数,但如果您不想这样做,您可以只记录多个返回值。

 when(someService.doSomething(any(SomeParam.class))).thenReturn(
  firstReturnValue, secondReturnValue, thirdReturnValue
);

现在第一个调用将返回 firstValue ,第二个 secondValue 和所有后续的 thirdValue

原文由 Sean Patrick Floyd 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题