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

how to assert orders of calls to one single mock?

我想用 mockito 写一个 junit 测试

说这是我的模拟:

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

我想验证 sendRequest 在用 request2 调用之前用 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()

有人评论说我可以使用 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).

我遇到了类似的问题。 问题可能是您必须同时导入 InOrder class 和 inOrder 方法,即;

import org.mockito.InOrder;
import static org.mockito.Mockito.inOrder;

如果您在上面添加第二个导入,那么应该可以识别该方法。


另一种方法(实际上是在做同样的事情)是导入

import org.mockito.Mockito;

并从 class 即

调用方法
InOrder inOrder = Mockito.inOrder(mockRoutingServerApi);

希望对您有所帮助!