Jukitoの紹介

ジュキトの紹介

1. 概要

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

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

2. 設定する

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


    org.jukito
    jukito
    1.5
    test

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

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によって作成された同じインターフェイスのすべてのバインディングを取得し、テストwith all the different implementations injected at runtimeを実行します。

テストを実行すると、実際には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);
}

the @All annotation is going to produce the Cartesian product of the different combinations between the different implementations of the Calculator interface and the AdditionTest instances.

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

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がテストスイート全体の使用を許可する方法を確認しました。

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