2

モック オブジェクトで呼び出される 3 つのメソッドがあります。メソッドの 1 つが他の 2 つよりも前に呼び出されることが重要ですが、最後の 2 つがどの順序で呼び出されるかは気にしません。

このロジックは Mockito で表現できますか? 私が知る限り、InOrder以下に示すように、クラスは 3 つの呼び出しすべてを順序付けるように強制します。

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()

これを解決して、テストが最後の 2 つのメソッドが呼び出される正確な順序と密接に結合されないようにしたいと思います。

この質問は重複している可能性がありますが、OPが何を求めていたのか、その答えが私に当てはまるのかどうかを正確に理解するのに苦労しました.

4

1 に答える 1

5

次の 2 つの 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 に答える