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

Java Mockito:inoorder.verify不禁止对模拟进行中间调用,java,unit-testing,mockito,Java,Unit Testing,Mockito,我想测试一下,mock上的一个方法是否以正确的顺序被调用,使用正确的参数,以及与相应参数相关的正确数量的方法调用 假设我想测试一下,List.add的调用方式如下: List<String> listMock = Mockito.mock(List.class); listMock.add("A"); listMock.add("C"); InOrder inOrder = Mockito.inOrder(listMock); inOrder.verify(listMock).ad

我想测试一下,mock上的一个方法是否以正确的顺序被调用,使用正确的参数,以及与相应参数相关的正确数量的方法调用

假设我想测试一下,
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();
现在,我的测试逻辑是通过Mockito.verify和InOrder.verify展开的


是否有更优雅的解决方案禁止中间调用
add

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

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

这样,如果在这两个调用之间发生另一个调用,验证就会失败,因为它需要2个调用,而您的示例需要调用它3次。它还可以确保调用时以所需的顺序使用给定的参数。

更新答案。它应该做你想做的。嗨,马库斯,我删除了我的第一条评论,因为它不再适合你更新的答案。非常感谢你的回答。这种方法非常好用,而且比我的方法更优雅。不幸的是,我没有注意到
Mockito.verifyNoMoreInteractions
inoder.verifyNoMoreInteractions
之间的细微差别。
// 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();
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
Mockito.verifyNoMoreInteractions(listMock);