验证模拟调用的顺序

时间:2017-04-13 13:40:56

标签: java junit mockito

我需要测试一个对象是否以正确的顺序调用其他对象方法。 不幸的是,看起来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)

我不明白为什么会收到此错误。测试中的调用顺序与方法中的相同。

1 个答案:

答案 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();