5.1 Annotation @ParameterizedTest

Parfois, vous souhaitez simplement appeler le test plusieurs fois avec différents paramètres : différentes valeurs, différents paramètres d'entrée, différents noms d'utilisateur. JUnit vise à vous faciliter la vie, donc pour ce cas, il a des tests paramétrés.

Pour utiliser des tests paramétrés, vous devez ajouter une autre dépendance à votrepom.xml :

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

On peut alors considérer un exemple :

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

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

Chaque méthode de test sera appelée 3 fois, et à chaque fois qu'elle sera appelée, un autre paramètre lui sera passé. Les valeurs sont définies à l'aide d'une autre annotation - @ValueSource . Mais il faut en dire plus.

5.2 Annotation @ValueSource

L' annotation @ValueSource est idéale pour travailler avec des primitives et des littéraux. Il suffit de lister les valeurs des paramètres séparées par des virgules et le test sera appelé une fois pour chaque valeur.

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

Mais il y a aussi un moins - cette annotation ne prend pas en charge null, vous devrez donc utiliser une béquille spéciale pour cela - @NullSource . Il ressemble à ceci :

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

5.3 Annotation @EnumSource

Il existe également une annotation spéciale @EnumSource , qui transmet toutes les valeurs d'un Enum spécifique à la méthode. Son application ressemble à ceci :

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 Annotation @MethodSource

Mais comment passer des objets en paramètres ? Surtout s'ils ont un algorithme de construction complexe. Pour ce faire, vous pouvez simplement spécifier une méthode d'assistance spéciale qui renverra une liste (Stream) de ces valeurs.

Exemple:

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

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

Tests paramétrés avec plusieurs arguments

Bien entendu, vous vous êtes déjà demandé quoi faire si vous souhaitez passer plusieurs paramètres à la méthode. Il existe une annotation @CSVSource très intéressante pour ce fichier . Il permet de lister les valeurs des paramètres de la méthode simplement séparées par des virgules.

Exemple:

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