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

时间:2016-04-28 08:57:17

标签: 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);

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

我该怎么做?

我已经看到了这个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,但我看不清楚。

2 个答案:

答案 0 :(得分:2)

可以使用

ArgumentCaptor代替InOrder来检查收到的值。

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

然后你可以检查waht是否传递给sendRoutingRequest

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

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

答案 1 :(得分:0)

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

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

如果您添加上面的第二个导入,则应识别该方法。

另一种方法(真正做同样的事情)是import

import org.mockito.Mockito;

并从类中调用方法,即

InOrder inOrder = Mockito.inOrder(mockRoutingServerApi);

希望这有帮助!