5.1 @ParameterizedTest アノテーション

場合によっては、異なる値、異なる入力パラメータ、異なるユーザー名など、異なるパラメータを使用してテストを複数回呼び出したい場合があります。JUnit はユーザーの作業を容易にすることを目的としているため、この場合にはパラメーター化されたテストのようなものが備わっています。

パラメーター化されたテストを使用するには、依存関係をもう 1 つ追加する必要がありますpom.xml

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

次に、例を考えてみましょう。

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethod(int argument) {
    //test code
}

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

各テスト メソッドは 3 回呼び出され、呼び出されるたびに別のパラメーターが渡されます。値は別のアノテーション@ValueSourceを使用して設定されます。しかし、それについてはさらに説明する必要があります。

5.2 @ValueSource アノテーション

@ValueSourceアノテーションは、プリミティブとリテラルを操作するのに最適です。パラメータ値をカンマで区切ってリストするだけで、値ごとにテストが 1 回呼び出されます。

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

ただし、マイナス点もあります。このアノテーションは null をサポートしていないため、特別なサポート ( @NullSource ) を使用する必要があります。次のようになります。

@ParameterizedTest
@NullSource
void testMethodNullSource(Integer argument) {
    assertTrue(argument == null);
}

5.3 @EnumSource アノテーション

特定の Enum のすべての値をメソッドに渡す特別なアノテーション@EnumSourceもあります。そのアプリケーションは次のようになります。

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
    assertNotNull(d);
}

5.4 @MethodSource アノテーション

しかし、オブジェクトをパラメータとして渡すにはどうすればよいでしょうか? 特に複雑な構築アルゴリズムを使用している場合はそうです。これを行うには、そのような値のリスト (ストリーム) を返す特別なヘルパー メソッドを指定するだけです。

例:

@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> argsProviderFactory() {
    return Stream.of("one", "two",  "three");
}

複数の引数を使用したパラメータ化されたテスト

もちろん、メソッドに複数のパラメーターを渡したい場合はどうすればよいか、すでに考えているでしょう。これには非常にクールな@CSVSourceアノテーションがあります。これにより、メソッドパラメータの値をカンマで区切ってリストすることができます。

例:

@ParameterizedTest
@CsvSource({
    "alex, 30, Programmer, Working",
    "brian, 35, Tester, Working",
	"charles, 40, manager, kicks"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
	//method code
}