5.1 Adnotacja @ParameterizedTest

Czasami chcesz po prostu wywołać test wiele razy z różnymi parametrami: różnymi wartościami, różnymi parametrami wejściowymi, różnymi nazwami użytkowników. JUnit ma na celu ułatwienie Ci życia, więc w tym przypadku ma coś takiego jak testy sparametryzowane.

Aby korzystać z testów sparametryzowanych, musisz dodać jeszcze jedną zależność do swojego pom.xml:

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

Następnie możemy rozważyć przykład:

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

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

Każda metoda testowa zostanie wywołana 3 razy i za każdym razem zostanie do niej przekazany inny parametr. Wartości ustawia się za pomocą innej adnotacji - @ValueSource . Ale trzeba o tym powiedzieć więcej.

5.2 Adnotacja @ValueSource

Adnotacja @ValueSource doskonale nadaje się do pracy z prymitywami i literałami. Po prostu wypisz wartości parametrów oddzielone przecinkami, a test zostanie wywołany raz dla każdej wartości.

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

Ale jest też minus - ta adnotacja nie obsługuje wartości null, więc będziesz musiał użyć do tego specjalnej kuli - @NullSource . To wygląda tak:

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

5.3 Adnotacja @EnumSource

Istnieje również specjalna adnotacja @EnumSource , która przekazuje do metody wszystkie wartości konkretnego Enum. Jego zastosowanie wygląda następująco:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 Adnotacja @MethodSource

Ale jak przekazać obiekty jako parametry? Zwłaszcza jeśli mają złożony algorytm konstrukcyjny. Aby to zrobić, możesz po prostu określić specjalną metodę pomocniczą, która zwróci listę (Stream) takich wartości.

Przykład:

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

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

Sparametryzowane testy z wieloma argumentami

Oczywiście zastanawiałeś się już, co zrobić, jeśli chcesz przekazać do metody kilka parametrów. Jest do tego bardzo fajna adnotacja @CSVSource . Pozwala na wypisanie wartości parametrów metody po prostu oddzielonych przecinkami.

Przykład:

@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
}