Java 如何在不明确定义方法顺序的情况下验证模拟的顺序?
以下是要测试的方法:Java 如何在不明确定义方法顺序的情况下验证模拟的顺序?,java,unit-testing,junit,mocking,mockito,Java,Unit Testing,Junit,Mocking,Mockito,以下是要测试的方法: protected void myMethod(final MyObject object) { object.setX(...); object.setY(...); myObjectRepository.update(object); } @Mock private MyObjectRepository myObjectRepositoryMock; @Test public void testMyMethod() { MyObj
protected void myMethod(final MyObject object) {
object.setX(...);
object.setY(...);
myObjectRepository.update(object);
}
@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);
}
inOrder.verify(myObjectMock).setX(..);
inOrder.verify(myObjectMock).setY(..);
inOrder.verify(myObjectRepositoryMock).update(myObjectMock);
为了验证调用的顺序,以便在所有setter调用之后调用存储库,我需要对MyObject进行模拟(因为inoder只处理模拟)最后应该是这样的:
protected void myMethod(final MyObject object) {
object.setX(...);
object.setY(...);
myObjectRepository.update(object);
}
@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);
}
inOrder.verify(myObjectMock).setX(..);
inOrder.verify(myObjectMock).setY(..);
inOrder.verify(myObjectRepositoryMock).update(myObjectMock);
。。但我们看到了这个例外:
.. UnfinishedVerificationException
Missing method call for verify(mock) here:
...
Example of correct verification:
verify(mock).doSomething()
由于我不必验证setter调用的顺序,我只需要将它们组合在一起,然后说“首先调用这个mock,然后调用这个mock的方法和那个参数”
我不想这样定义确切的顺序:
protected void myMethod(final MyObject object) {
object.setX(...);
object.setY(...);
myObjectRepository.update(object);
}
@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);
}
inOrder.verify(myObjectMock).setX(..);
inOrder.verify(myObjectMock).setY(..);
inOrder.verify(myObjectRepositoryMock).update(myObjectMock);
有办法吗?您可以在
doAnswer()
object.setX(-1);
Mockito.doAnswer(新答案(){
public Void answer(invocationMock调用)抛出可丢弃的{
assertEquals(1,object.getX());
返回null;
}
}).when(myObjectRepositoryMock).update(对象);
这样一来,通话顺序就不重要了;重要的是在调用
update()
时,正确的值位于正确的位置。我也刚刚发现了这一点!非常感谢。