我正在尝试在模拟对象上按预期顺序调用方法。下面是简化的示例:
@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();
问题是您需要添加
inOrder.verifyNoMoreInteractions();
通过循环,您可以生成类似
当您再检查
inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("a");
它与调用(add(b),add(c),add(a))匹配。不检查其他呼叫。
因此,我认为您必须选择:1)验证所有调用a,b,c,a,b,c 2)验证模拟不再发生任何交互
顺便说一句,如果您将验证更改为
inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("a");
它会失败,因为它与呼叫不匹配:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句