【问题标题】:How to verify the order of mocks without explicitly defining the order of methods?如何在不明确定义方法顺序的情况下验证模拟的顺序?
【发布时间】:2015-04-09 12:23:49
【问题描述】:

这里是要测试的方法

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);

有没有办法做到这一点?

【问题讨论】:

    标签: java unit-testing junit mocking mockito


    【解决方案1】:

    您可以在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() 调用时,正确的值在正确的位置。

    【讨论】:

    • 我也刚刚发现!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多