我要测试的是,以正确的顺序调用模拟对象上的方法,并带有正确的参数以及关于相应参数的正确数量的方法调用。
假设我要测试,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
的中间调用?
答案 0 :(得分:1)
您应该在模拟对象上调用verifyNoMoreInteractions()
方法,以确保不再进行调用:
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
Mockito.verifyNoMoreInteractions(listMock);
这样,如果另一个呼叫在两次呼叫之间发生,则验证将失败,因为它期望2次呼叫,而您的示例呼叫3次。它还可以确保以完全正确的顺序以给定的参数进行调用。