我想用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()
有人评论说我可以使用ArgumentCaptor
,但我看不清楚。
答案 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);
希望这有帮助!