Mockito:InOrder.verify不禁止对模拟进行中间调用

时间:2019-03-26 13:04:32

标签: java unit-testing mockito

我要测试的是,以正确的顺序调用模拟对象上的方法,并带有正确的参数以及关于相应参数的正确数量的方法调用。

假设我要测试,List.add的调用方式如下:

List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("C");

InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();

此测试可以正常运行,但对于我的意图而言还不够严格。问题是,如果实际调用发生更改,则测试不一定会失败。例如,如果您这样做:

List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("B");
listMock.add("C");

// this won't fail
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();

我确实想验证add首先是用“ A”调用,然后是add是用“ C”调用。同时,add完全不应该被调用。

我想出的唯一解决方案是Mockito.verify和InOrder.verify的组合:

// this works but doesn't seem very elegant
Mockito.verify(listMock, times(2)).add(Mockito.anyString());
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();

现在,我的测试逻辑遍布Mockito.verify和InOrder.verify。

有没有更优雅的解决方案,禁止对add的中间调用?

1 个答案:

答案 0 :(得分:1)

您应该在模拟对象上调用verifyNoMoreInteractions()方法,以确保不再进行调用:

InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
Mockito.verifyNoMoreInteractions(listMock);

这样,如果另一个呼叫在两次呼叫之间发生,则验证将失败,因为它期望2次呼叫,而您的示例呼叫3次。它还可以确保以完全正确的顺序以给定的参数进行调用。