1. 概要

Jukito は、 JUnit Guice 、および Mockito の組み合わせであり、同じインターフェイスの複数の実装のテストを簡素化するために使用されます。

この記事では、作成者がこれら3つのライブラリを組み合わせて、多くの定型コードを削減し、テストを柔軟かつ簡単にする方法を説明します。

2. セットアップ

まず、プロジェクトに次の依存関係を追加します。

<dependency>
    <groupId>org.jukito</groupId>
    <artifactId>jukito</artifactId>
    <version>1.5</version>
    <scope>test</scope>
</dependency>

最新バージョンはMavenCentralにあります。

3. インターフェイスのさまざまな実装

Jukitoの機能を理解するために、Addメソッドを使用して単純なCalculatorインターフェイスを定義します。

public interface Calculator {
    public double add(double a, double b);
}

そして、次のインターフェースを実装します。

public class SimpleCalculator implements Calculator {

    @Override
    public double add(double a, double b) {
        return a + b;
    }
}

また、別の実装が必要です。

public class ScientificCalculator extends SimpleCalculator {
}

それでは、Jukitoを使用して両方の実装をテストしてみましょう。

@RunWith(JukitoRunner.class)
public class CalculatorTest {

    public static class Module extends JukitoModule {

        @Override
        protected void configureTest() {
            bindMany(Calculator.class, SimpleCalculator.class, 
              ScientificCalculator.class);
        }
    }

    @Test
    public void givenTwoNumbers_WhenAdd_ThenSumBoth(@All Calculator calc) {
        double result = calc.add(1, 1);
 
        assertEquals(2, result, .1);
    }
}

この例では、 JukitoModule を確認できます。これは、指定されたすべての実装で配線されています。

@All アノテーションは、 JukitoModule によって作成された同じインターフェイスのすべてのバインディングを取得し、実行時にすべての異なる実装を注入してテストを実行します

テストを実行すると、実際に1つではなく2つのテストが実行されていることがわかります。

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

4. デカルト積

次に、Addメソッドのテストのさまざまな組み合わせに対応する単純なネストされたクラスを追加しましょう。

public static class AdditionTest {
    int a;
    int b;
    int expected;

    // standard constructors/getters
}

これにより、実行できるテストの数が増えますが、最初に、configureTestメソッドにバインディングを追加する必要があります。

bindManyInstances(AdditionTest.class, 
  new AdditionTest(1, 1, 2), 
  new AdditionTest(10, 10, 20), 
  new AdditionTest(18, 24, 42));

そして最後に、スイートに別のテストを追加します。

@Test
public void givenTwoNumbers_WhenAdd_ThenSumBoth(
  @All Calculator calc, 
  @All AdditionTest addTest) {
 
    double result = calc.add(addTest.a, addTest.b);
 
    assertEquals(addTest.expected, result, .1);
}

@Allアノテーションは、Calculatorインターフェイスのさまざまな実装とAdditionTestインスタンスの間のさまざまな組み合わせのデカルト積を生成します。

現在生成されているテストの数が増えていることを確認できます。

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

デカルト積では、テストの実行回数が大幅に増加することを覚えておく必要があります。

すべてのテストの実行時間は、実行回数に比例して増加します。 つまり、 @All アノテーションが付いた3つのパラメーターと、パラメーターごとに4つのバインディングを持つテストメソッドが4 x 4 x 4=64回実行されます。

同じテストメソッドに5つのバインディングがあると、5 x 5 x 5=125の実行になります。

5. 名前によるグループ化

ここで説明する最後の機能は、名前によるグループ化です。

bindManyNamedInstances(Integer.class, "even", 2, 4, 6);
bindManyNamedInstances(Integer.class, "odd", 1, 3, 5);

ここでは、整数クラスの名前付きインスタンスを configureTest メソッドに追加して、これらのグループで何ができるかを示しました。

次に、さらにいくつかのテストを追加しましょう。

@Test
public void givenEvenNumbers_whenPrint_thenOutput(@All("even") Integer i) {
    System.out.println("even " + i);
}

@Test
public void givenOddNumbers_whenPrint_thenOutput(@All("odd") Integer i) {
    System.out.println("odd " + i);
}

上記の例では、「偶数2」、「偶数4」、「偶数6」、「奇数1」、「奇数3」、「奇数5」の6つの文字列を出力します。

これらの順序は実行時に保証されないことに注意してください。

6. 結論

このクイックチュートリアルでは、Jukitoがテストケースの十分な組み合わせを提供することにより、テストスイート全体をどのように使用できるかを確認しました。

完全な例は、GitHubにあります。