我正在尝试测试是否按预期顺序调用模拟对象上的方法。下面是一个简化的例子:
@Test
public void test() {
List<String> mockedList = Mockito.mock(List.class);
for (int i = 0; i < 5; i++) {
mockedList.add("a");
mockedList.add("b");
mockedList.add("c");
}
// I want only this to pass.
InOrder inOrder1 = Mockito.inOrder(mockedList);
inOrder1.verify(mockedList).add("a");
inOrder1.verify(mockedList).add("b");
inOrder1.verify(mockedList).add("c");
// I want this to fail.
InOrder inOrder2 = Mockito.inOrder(mockedList);
inOrder2.verify(mockedList).add("c");
inOrder2.verify(mockedList).add("b");
inOrder2.verify(mockedList).add("a");
}
尽管验证顺序 ( c -> b -> a) 与调用顺序 ( a -> b -> c) 不同,但此测试通过。这是因为 Mockito 验证 method2 是否在method1之后的任何地方调用,但不是立即调用(即,在两者之间没有调用其他方法)。因为我要多次添加元素,所以这是很有可能的。这意味着,Mockito InOrder 传递为b -> a -> c -> a -> c -> b -> c -> b -> a ...
但我希望这失败,并确保订单始终是 a -> b -> c -> a -> b -> c -> a -> b -> c ...
更新:正确的验证方法是验证顺序相同的迭代次数(已接受答案的摘要):
for (int i = 0; i < 5; i++) {
inOrder1.verify(mockedList).add("a");
inOrder1.verify(mockedList).add("b");
inOrder1.verify(mockedList).add("c");
}
// fail the test if we missed to verify any other invocations
inOrder1.verifyNoMoreInteractions();
翻过高山走不出你
相关分类