2

我有三个在模拟对象上调用的方法。在其他两个方法之前调用其中一个方法很重要,但我不关心最后两个调用的顺序。

这个逻辑可以用 Mockito 来表达吗?据我所知,InOrder该类将强制我对所有三个调用进行排序,如下所示:

InOrder inOrder = inOrder(mock);
inOrder.verify(mock).crucialMethod();
inOrder.verify(mock).methodX();
inOrder.verify(mock).methodY(); // <-- I wouldn't care if this was invoked
                                //     before methodX()

我想解决这个问题,以便我的测试与调用最后两个方法的确切顺序不那么紧密。

这个问题可能是重复的,但我一直在努力理解 OP 正在寻找什么,也不知道答案是否适用于我。

4

1 回答 1

5

您可以使用两个 InOrder 对象:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.exceptions.verification.VerificationInOrderFailure;

public class MyTest {

    public interface ToBeTested{
        public void crucialMethod();
        public void methodX();
        public void methodY();
    }

    @Test
    public void testXThenY(){
        // Given
        ToBeTested toBeTested = mock(ToBeTested.class);

        // When
        toBeTested.crucialMethod();
        toBeTested.methodX();
        toBeTested.methodY();

        // Then

        InOrder inOrderX = inOrder(toBeTested);
        inOrderX.verify(toBeTested).crucialMethod();
        inOrderX.verify(toBeTested).methodX();

        InOrder inOrderY = inOrder(toBeTested);
        inOrderY.verify(toBeTested).crucialMethod();
        inOrderY.verify(toBeTested).methodY();
    }

    @Test(expected=VerificationInOrderFailure.class)
    public void crucialTooLateForX(){
        // Given
        ToBeTested toBeTested = mock(ToBeTested.class);

        // When

        toBeTested.methodX();
        toBeTested.crucialMethod();
        toBeTested.methodY();

        // Then

        InOrder inOrderX = inOrder(toBeTested);
        inOrderX.verify(toBeTested).crucialMethod();
        inOrderX.verify(toBeTested).methodX();

        InOrder inOrderY = inOrder(toBeTested);
        inOrderY.verify(toBeTested).crucialMethod();
        inOrderY.verify(toBeTested).methodY();
    }

    @Test(expected=VerificationInOrderFailure.class)
    public void crucialTooLateForY(){
        // Given
        ToBeTested toBeTested = mock(ToBeTested.class);

        // When

        toBeTested.methodY();
        toBeTested.crucialMethod();
        toBeTested.methodX();

        // Then

        InOrder inOrderX = inOrder(toBeTested);
        inOrderX.verify(toBeTested).crucialMethod();
        inOrderX.verify(toBeTested).methodX();

        InOrder inOrderY = inOrder(toBeTested);
        inOrderY.verify(toBeTested).crucialMethod();
        inOrderY.verify(toBeTested).methodY();
    }
}
于 2013-04-25T08:45:03.293 回答