我需要测试一个对象是否以正确的顺序调用其他对象方法。 不幸的是,看起来Mockito使用某种分组来进行具有相同参数的调用。我准备了一个说明这种行为的例子。
public class TestInOrder {
@Test
public void test() {
Foo foo = new Foo();
Bar mockBar = mock(Bar.class);
foo.run(mockBar);
InOrder order = Mockito.inOrder(mockBar);
order.verify(mockBar).A();
order.verify(mockBar).B();
order.verify(mockBar).B();
order.verify(mockBar).A();
order.verify(mockBar).B();
}
}
class Foo {
void run(Bar mockBar) {
mockBar.A();
mockBar.B();
mockBar.B();
mockBar.A();
mockBar.B();
}
}
class Bar {
public void A() {
}
public void B() {
}
}
结果是:
org.mockito.exceptions.verification.VerificationInOrderFailure:
Verification in order failure:
bar.B();
Wanted 1 time:
-> at com.goeuro.pi.provider.busfor.TestInOrder.test(TestInOrder.java:19)
But was 3 times. Undesired invocation:
-> at com.goeuro.pi.provider.busfor.Foo.run(TestInOrder.java:32)
我不明白为什么会收到此错误。测试中的调用顺序与方法中的相同。
答案 0 :(得分:3)
问题是您期望在每个模拟上进行一次调用。相反,Mockito
将计算某些模拟上的所有调用,并且当连续发生2时将失败。
这是InOrderImpl
类中验证方法的实现。
public <T> T verify(T mock) {
return this.verify(mock, VerificationModeFactory.times(1));
}
正如您所看到的,它告诉mockito
期望对方法进行精确的一次调用。
来自JavaDoc:
允许验证确切的调用次数。
使用VerificationMode告诉Mockito如何验证你的模拟。这应该有所帮助:
InOrder order = Mockito.inOrder(mockBar);
order.verify(mockBar).A();
order.verify(mockBar, times(2)).B();
order.verify(mockBar).A();
order.verify(mockBar).B();