如何在不显式定义方法顺序的情况下验证模拟的顺序?
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()
时,正确的值位于正确的位置。
下面是要测试的方法:
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()
时,正确的值位于正确的位置。