Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不明确定义方法顺序的情况下验证模拟的顺序?_Java_Unit Testing_Junit_Mocking_Mockito - Fatal编程技术网

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()
时,正确的值位于正确的位置。

我也刚刚发现了这一点!非常感谢。