如何在不显式定义方法顺序的情况下验证模拟的顺序?

How to verify the order of mocks without explicitly defining the order of methods?

下面是要测试的方法:

protected void myMethod(final MyObject object) {

    object.setX(...);
    object.setY(...);

    myObjectRepository.update(object);
}

为了验证调用顺序 - 以便在所有 setter 调用之后调用存储库 - 我需要模拟 MyObject (因为 inOrder 仅适用于模拟)。 最后应该是这样:

@Mock
private MyObjectRepository myObjectRepositoryMock;

@Test
public void testMyMethod() {
    MyObject myObjectMock = mock(MyObject.class);

    InOrder inOrder = Mockito.inOrder(myObjectMock, myObjectRepositoryMock);

    // Run Test .....

    inOrder.verify(myObjectMock);
    inOrder.verify(myObjectRepositoryMock).update(myObjectMock);
}

..但我们看到这个异常:

.. UnfinishedVerificationException
Missing method call for verify(mock) here:
...
Example of correct verification:
    verify(mock).doSomething()

因为我不必验证 setter 调用的顺序,所以我会把它们组合在一起并像 "first this mock, than that method of that mock with that argument should be called"..

这样说

我不想定义这样的确切顺序:

    inOrder.verify(myObjectMock).setX(..);
    inOrder.verify(myObjectMock).setY(..);
    inOrder.verify(myObjectRepositoryMock).update(myObjectMock);

有办法吗?

您可以在 doAnswer()

中使用 assertEquals 验证字段
object.setX(-1);
Mockito.doAnswer(new Answer<Void>() { 
        public Void answer(InvocationOnMock invocation) throws Throwable { 
                assertEquals(1, object.getX());
                return null; 
        } 
}).when(myObjectRepositoryMock).update(object); 

这样一来,调用的顺序就无关紧要了;重要的是在调用 update() 时,正确的值位于正确的位置。