java - 如何断言对一个模拟的调用顺序?

标签 java unit-testing junit mocking mockito

我想用mockito编写junit测试

说这是我的模拟:

IServerApi routingServerApi = mock(ServerApi.class);
        when(routingServerApi.sendRequest(anyString(), eq("request1"))).thenReturn(myObj1);
        when(routingServerApi.sendRequest(anyString(), eq("request2"))).thenReturn(myObj2);

我想验证在使用 request2 调用 sendRequest 之前是否使用 request1 调用它(并且它们之间没有其他调用)。

我该怎么做?

我看过这个SOF问题,

但我想验证对一个模拟的调用顺序,而不是两个。

此语法对我不起作用(初始化 inOrder() 时出现编译错误)

InOrder inOrder = inOrder(mockRoutingServerApi);

inOrder.verify(mockRoutingServerApi).sendRtUpdates(time1, ImmutableList.of("update1"));
inOrder.verify(mockRoutingServerApi).sendRoutingRequest("request1");
inOrder.verify(mockRoutingServerApi).sendRtUpdates(time1, ImmutableList.of("update2"));
inOrder.verify(mockRoutingServerApi).sendRoutingRequest("request2");

它无法识别inOrder()

enter image description here

有人评论说我可以使用 ArgumentCaptor 但我不知道如何使用。

最佳答案

ArgumentCaptor 可以用来代替 InOrder 检查接收到的值。

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
verify(mockRoutingServerApi, times(2)).sendRoutingRequest(captor.capture());

然后您可以检查传递给 sendRoutingRequest 的内容

captor.getAllValues() //Should be a List with values {"request1", "request2"}

这看起来更像是发明轮子,因为 Mockito 支持 InOrder.verify。 确保您有 Mockito 的静态导入。否则请尝试 Mockito.inOrder(routingServerApi)

关于java - 如何断言对一个模拟的调用顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36909853/

相关文章:

Java 接口(interface) - 返回方法调用

java - 在 String.format() 中组合使用 String 和 Varargs

java - 如何在单元测试时重新初始化静态 final

java - 关于单元测试结构的思考

java - 有什么方法可以对采用 MediaType.MULTIPART_FORM_DATA 进行文件上传的休息服务进行 junit 测试吗?

java - 无法启动嵌入式tomcat

python - 在 Python unittest TestLoader 中指定具体的测试用例

unit-testing - 使用 OpenEJB 进行 EJB 存储库测试 - 如何回滚更改

java - 有什么办法可以代替动态方法吗?

java - 使用 Spring 解析和使用 HTTP Range header