1概要


Jukito

は、http://junit.org/junit5/[JUnit]、https://github.com/google/guice[Guice]、およびhttpsの総合力です。 ://github.com/mockito/mockito[Mockito] – 同じインターフェースの複数の実装のテストを簡単にするために使用されます。

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


2セットアップ

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

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

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cjukito[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

によって作成された同じインターフェースのすべてのバインディングを取得し、実行時に注入されたすべての異なる実装を使用して

テストを実行します

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

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

すべてのテストの実行時間は、実行数に比例して長くなります。 i:e .:

@ All

アノテーションを持つ3つのパラメータと1つのパラメータにつき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);
}

上記の例では、「even 2」、「even 4」、「even 6」、「odd 1」、「odd 3」、「odd 5」の6つの文字列が印刷されます。

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


6. 結論

この簡単なチュートリアルでは、Jukitoがテストケースの組み合わせを十分に提供することによって、テストスイート全体の使用をどのように可能にするかを見ました。

完全な例はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[over on GitHub]にあります。