5.1 @ParameterizedTest-Annotation

Manchmal möchten Sie den Test einfach mehrmals mit unterschiedlichen Parametern aufrufen: unterschiedliche Werte, unterschiedliche Eingabeparameter, unterschiedliche Benutzernamen. JUnit möchte Ihnen das Leben erleichtern und bietet für diesen Fall so etwas wie parametrisierte Tests.

Um parametrisierte Tests verwenden zu können, müssen Sie eine weitere Abhängigkeit zu Ihrem hinzufügen pom.xml:

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

Dann können wir ein Beispiel betrachten:

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

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

Jede Testmethode wird dreimal aufgerufen und bei jedem Aufruf wird ihr ein weiterer Parameter übergeben. Werte werden mithilfe einer anderen Annotation festgelegt – @ValueSource . Aber dazu muss noch mehr gesagt werden.

5.2 @ValueSource-Annotation

Die Annotation @ValueSource eignet sich hervorragend für die Arbeit mit Grundelementen und Literalen. Listen Sie einfach die Parameterwerte durch Kommas getrennt auf und der Test wird für jeden Wert einmal aufgerufen.

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

Aber es gibt auch ein Minus: Diese Annotation unterstützt Null nicht, daher müssen Sie dafür eine spezielle Krücke verwenden – @NullSource . Es sieht aus wie das:

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

5.3 @EnumSource-Annotation

Es gibt auch eine spezielle Annotation @EnumSource , die alle Werte eines bestimmten Enums an die Methode übergibt. Seine Anwendung sieht so aus:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 @MethodSource-Annotation

Aber wie übergibt man Objekte als Parameter? Vor allem, wenn sie über einen komplexen Konstruktionsalgorithmus verfügen. Dazu können Sie einfach eine spezielle Hilfsmethode angeben, die eine Liste (Stream) solcher Werte zurückgibt.

Beispiel:

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

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

Parametrisierte Tests mit mehreren Argumenten

Natürlich haben Sie sich bereits gefragt, was zu tun ist, wenn Sie der Methode mehrere Parameter übergeben möchten. Dafür gibt es eine sehr coole @CSVSource- Annotation . Es ermöglicht Ihnen, die Werte der Methodenparameter einfach durch Kommas getrennt aufzulisten.

Beispiel:

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