Mockito:如何验证某些方法调用组的组顺序?

ben*_*min 13 java tdd verification unit-testing mockito

我正在使用Mockito验证InOrder对象的方法调用顺序.但是我对调用的总排序不感兴趣,只是在调用其他一些方法之前,某些方法调用都发生了.比如这样

@Test
public void testGroupOrder() {
    Foo foo1 = mock(Foo.class);
    Foo foo2 = mock(Foo.class);
    Bar underTest = new Bar();
    underTest.addFoo(foo1);
    underTest.addFoo(foo2);

    underTest.fire()

    InOrder inOrder = inOrder(foo1,foo2);

    inorder.verify(foo1).doThisFirst();
    inorder.verify(foo2).doThisFirst();

    inorder.verify(foo1).beforeDoingThis();
    inorder.verify(foo2).beforeDoingThis();
}
Run Code Online (Sandbox Code Playgroud)

但是这个测试确实测试得太多了,因为它测试了Foo实例的顺序.但我只对不同方法的顺序感兴趣.事实上,我想underTest不区分它们的实例Foo,它们可能有一个内部顺序,所以foos被调用的顺序无关紧要.我想将其作为实现细节.

但重要的是,在调用任何其他foo 之前,doThisFirst()已经调用了所有 foos .有可能用Mockito表达吗?怎么样?beforeDoingThis()

EdC*_*EdC 8

Mockito验证传递给inorder函数的所有模拟的顺序.因此,如果您不想验证foos的顺序,则需要创建两个单独的in-order.即

@Test
public void testGroupOrder() {
    Foo foo1 = mock(Foo.class);
    Foo foo2 = mock(Foo.class);
    Bar underTest = new Bar();
    underTest.addFoo(foo1);
    underTest.addFoo(foo2);

    underTest.fire()

    InOrder inOrderFoo1 = inOrder(foo1);
    inOrderFoo1.verify(foo1).doThisFirst();
    inOrderFoo1.verify(foo1).beforeDoingThis();

    InOrder inOrderFoo2 = inOrder(foo2);
    inOrderFoo2.verify(foo2).doThisFirst();
    inOrderFoo2.verify(foo2).beforeDoingThis();
}
Run Code Online (Sandbox Code Playgroud)