以下是要测试的方法:
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);
有没有办法做到这一点?
答案 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()
电话时,正确的值是在正确的位置。