如何在Mockito中表达"A,然后(B或C)"调用顺序?

Dun*_*nes 2 java mockito

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

可以用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()
Run Code Online (Sandbox Code Playgroud)

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

这个问题可能是重复的,但我很难准确理解OP正在寻求什么,也不知道答案是否适用于我.

rco*_*len 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();
    }
}
Run Code Online (Sandbox Code Playgroud)