如何在没有明确定义方法顺序的情况下验证模拟的顺序?

时间:2015-04-09 12:23:50

标签: java unit-testing junit mocking mockito

以下是要测试的方法

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调用的顺序,所以我只是将它们组合在一起并说出类似于"首先这个模拟,比那个带有该参数的模拟的方法应该被调用"。

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

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

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以在assertEquals

内验证doAnswer()字段
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()电话时,正确的值是在正确的位置。