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("uno", "dos", "tres");
}
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, programador, trabajando",
"brian, 35, Probador, Trabajando",
"charles, 40, gerente, patadas"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
// código de método
}
GO TO FULL VERSION