5.1 Anotación @ParameterizedTest

A veces, solo desea llamar a la prueba varias veces con diferentes parámetros: diferentes valores, diferentes parámetros de entrada, diferentes nombres de usuario. JUnit tiene como objetivo hacer su vida más fácil, por lo que para este caso tiene pruebas parametrizadas.

Para usar pruebas parametrizadas, debe agregar una dependencia más a su pom.xml:

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

Entonces podemos considerar un ejemplo:

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

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

Cada método de prueba se llamará 3 veces, y cada vez que se llame, se le pasará otro parámetro. Los valores se establecen mediante otra anotación: @ValueSource . Pero hay que decir más al respecto.

5.2 Anotación @ValueSource

La anotación @ValueSource es excelente para trabajar con primitivos y literales. Simplemente enumere los valores de los parámetros separados por comas y la prueba se llamará una vez para cada valor.

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

Pero también hay un inconveniente: esta anotación no admite nulo, por lo que deberá usar una muleta especial para ello: @NullSource . Se parece a esto:

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

5.3 Anotación @EnumSource

También hay una anotación especial @EnumSource , que pasa todos los valores de un Enum específico al método. Su aplicación se ve así:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

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

5.4 Anotación @MethodSource

Pero, ¿cómo pasar objetos como parámetros? Especialmente si tienen un algoritmo de construcción complejo. Para hacer esto, simplemente puede especificar un método auxiliar especial que devolverá una lista (Stream) de tales valores.

Ejemplo:

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

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

Pruebas parametrizadas con múltiples argumentos

Por supuesto, ya te habrás preguntado qué hacer si quieres pasar varios parámetros al método. Hay una anotación @CSVSource muy buena para esto . Te permite listar los valores de los parámetros del método simplemente separados por comas.

Ejemplo:

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