如何断言对一个模拟的调用顺序?
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);
希望对您有所帮助!
我想用 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);
希望对您有所帮助!