如何根据参数属性在 Mockito 中返回不同的值?

新手上路,请多包涵

我测试的类收到一个客户端包装器:

测试类(snippest)

 private ClientWrapper cw
public Tested(ClientWrapper cw) {
    this.cw = cw;
}

public String get(Request request) {
    return cw.getClient().get(request);
}

测试初始化:

 ClientWrapper cw = Mockito.mock(ClientWrapper.class);
Client client = Mockito.mock(Client.class);
Mockito.when(cw.getClient()).thenReturn(client);
//Here is where I want to alternate the return value:
Mockito.when(client.get(Mockito.any(Request.class))).thenReturn("100");

在示例中,我总是返回“100”,但请求有一个属性 id 我想返回不同的值 client.get(Request) 基于 request.getId() .

我该怎么做?

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

阅读 2.8k
2 个回答

您可以使用 Mockito 的答案,而不是:

 Mockito.when(client.get(Mockito.any(Request.class))).thenReturn("100");

写:

 Mockito.when(client.get(Mockito.any(Request.class)))
 .thenAnswer(new Answer() {
   Object answer(InvocationOnMock invocation) {
     Object[] args = invocation.getArguments();
     Object mock = invocation.getMock();
     return "called with arguments: " + args;
   }
});

原文由 Adam Siemion 发布,翻译遵循 CC BY-SA 3.0 许可协议

为了正确执行并使用最少的代码,您必须使用 ArgumentMatcher lambda 表达式, 不要忘记ArgumentMatcher lambda 中的过滤器成员进行空检查(特别是如果你有多个相同的模拟 ArgumentMatcher )。

自定义参数匹配器:

 private ArgumentMatcher<Request> matchRequestId(final String target) {
    return request -> request != null &&
            target.equals(request.getId());
}

用法:

  given(client.get(argThat(matchRequestId("1")))).willReturn("100");
 given(client.get(argThat(matchRequestId("2")))).willReturn("200");

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

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