5.1 Annotazione @ParameterizedTest

A volte vuoi solo chiamare il test più volte con parametri diversi: valori diversi, parametri di input diversi, nomi utente diversi. JUnit mira a semplificarti la vita, quindi per questo caso ha qualcosa come test parametrizzati.

Per utilizzare i test parametrizzati, devi aggiungere un'altra dipendenza al tuo pom.xml:

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

Allora possiamo considerare un esempio:

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

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

Ogni metodo di test verrà chiamato 3 volte e ogni volta che viene chiamato, gli verrà passato un altro parametro. I valori vengono impostati utilizzando un'altra annotazione: @ValueSource . Ma occorre dire di più al riguardo.

5.2 Annotazione @ValueSource

L' annotazione @ValueSource è ottima per lavorare con primitive e letterali. Basta elencare i valori dei parametri separati da virgole e il test verrà chiamato una volta per ogni valore.

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

Ma c'è anche un aspetto negativo: questa annotazione non supporta null, quindi dovrai utilizzare una stampella speciale per essa - @NullSource . Sembra così:

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

5.3 Annotazione @EnumSource

C'è anche un'annotazione speciale @EnumSource , che passa tutti i valori di uno specifico Enum al metodo. La sua applicazione è simile a questa:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 Annotazione @MethodSource

Ma come passare gli oggetti come parametri? Soprattutto se hanno un algoritmo di costruzione complesso. Per fare ciò, puoi semplicemente specificare un metodo helper speciale che restituirà un elenco (Stream) di tali valori.

Esempio:

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

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

Test parametrizzati con argomenti multipli

Ovviamente ti sei già chiesto cosa fare se vuoi passare diversi parametri al metodo. C'è un'annotazione @CSVSource molto interessante per questo . Permette di elencare i valori dei parametri del metodo semplicemente separati da virgole.

Esempio:

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