【问题标题】:how to assert orders of calls to one single mock?如何断言对单个模拟的调用顺序?
【发布时间】:2016-04-28 08:57:16
【问题描述】:

我想用 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,但我不知道如何使用。

【问题讨论】:

  • 错误信息是什么意思?您的代码看起来正确,不应该出现任何编译错误,因为 inOrder(Object... mocks) 接收可变参数。
  • 它无法识别 inOrder() 方法

标签: java unit-testing junit mocking mockito


【解决方案1】:

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)

【讨论】:

  • 它无法识别inOrcer() init 方法
【解决方案2】:

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

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

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


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

import org.mockito.Mockito;

并从类中调用方法,即

InOrder inOrder = Mockito.inOrder(mockRoutingServerApi);

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2016-09-29
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多