web-dev-qa-db-ja.com

JUnit @Ruleを使用したMockitoでのパラメーター化されたテスト?

これは this question から続きます。ここで、新しい質問を開始するように求められます。

問題は、JUnit Rule、またはRunnersなどで何が起こっているのか、Jeff Bowmanが示唆している方法で問題を解くために十分な知識がないことです。

13
mike rodent

後のコメントで、私はギャップを見つけました:ルールとしてMockitoを使用し、ランナーとしてパラメーター化する必要があります。逆ではありません。

その理由は、ランナーがテストの数を報告する責任があるため、Parameterizedはテストメソッドの数とパラメーター化された入力の数に基づいてテストの数を操作するため、Parameterizedがランナープロセスの一部であることが非常に重要です。 。対照的に、Mockitoランナーまたはルールの使用は、Mockitoアノテーションを初期化し、Mockitoの使用を検証する@Beforeおよび@Afterメソッドをカプセル化することであり、@Ruleとして非常に簡単に実行できます。それは他の@Ruleインスタンスに隣接して動作します-MockitoJUnitRunnerが 非常にほとんど非推奨 になるまで。

JUnit4 Parameterized Test docページおよび MockitoRule docページから直接クリブするには:

@RunWith(Parameterized.class)
public class YourComponentTest {

    @Rule public MockitoRule rule = MockitoJUnit.rule();
    @Mock YourDep mockYourDep;

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {     
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    private int fInput;

    private int fExpected;

    public YourComponentTest(int input, int expected) {
        fInput = input;
        fExpected = expected;
    }

    @Test
    public void test() {
        // As you may surmise, this is not a very realistic example of Mockito's use.
        when(mockYourDep.calculate(fInput)).thenReturn(fExpected);
        YourComponent yourComponent = new YourComponent(mockYourDep);
        assertEquals(fExpected, yourComponent.compute(fInput));
    }
}
24
Jeff Bowman