En el mundo de las pruebas unitarias con JUnit 5, la clase Assertions nos ofrece herramientas muy potentes para escribir tests más completos y claros. Aunque ya conocemos métodos básicos como assertEquals o assertTrue, existen otros asserts que nos permiten manejar situaciones más complejas de forma sencilla y elegante.
Uno de los más interesantes es assertAll. Este método nos permite agrupar múltiples asserts dentro de un mismo bloque y ejecutarlos todos, sin que la falla de uno interrumpa la ejecución de los demás. Esto es especialmente útil cuando queremos validar varias propiedades de un mismo objeto en un solo test. Por ejemplo, si tenemos un registro de Java que representa un producto, podemos comprobar que cada uno de sus campos tenga el valor esperado. Si uno de esos asserts falla, normalmente el test se detendría y no sabríamos si los demás campos están correctos o no. Con assertAll, podemos ver de golpe cuáles asserts pasan y cuáles fallan, lo que facilita mucho la identificación de errores.
La forma de usar assertAll es muy sencilla. Le pasamos como parámetros varias funciones lambda, cada una con un assert diferente. Así, podemos encadenar tantos asserts como queramos y todos se ejecutarán, reportando individualmente sus resultados. Por ejemplo:
assertAll(
() -> assertEquals(200, producto.getPrecio()),
() -> assertEquals("Jamón", producto.getNombre()),
() -> assertTrue(producto.isDisponible())
);
Si alguno de estos asserts falla, el test no se detendrá en ese punto, sino que seguirá evaluando los demás y nos mostrará un resumen con todos los fallos encontrados.
Además de assertAll, la clase Assertions incluye otros métodos muy útiles. Por ejemplo, assertTimeout nos permite verificar que un bloque de código se ejecute dentro de un tiempo límite. Esto es ideal para comprobar el rendimiento de métodos que deberían ser rápidos, como aquellos que interactúan con la red o bases de datos. Para usarlo, le indicamos una duración máxima y el código a ejecutar. Si el código tarda más, el test falla. Por ejemplo:
assertTimeout(Duration.ofMillis(200), () -> {
Thread.sleep(1000); // Simula una operación lenta
});
En este caso, el test fallará porque la ejecución supera los 200 milisegundos permitidos.
Otro aspecto importante es la comparación de arrays. No podemos usar assertEquals para comparar arrays, ya que este método compara referencias y no el contenido. Para comparar arrays elemento a elemento, debemos usar assertArrayEquals. Este método nos indica exactamente en qué posición difieren los arrays si no son iguales. Por ejemplo:
int[] esperado = {1, 2, 9};
int[] real = {1, 2, 8};
assertArrayEquals(esperado, real);
Aquí el test fallará y nos dirá que en la posición 2 esperaba un 9 pero encontró un 8.
Existen también otros asserts para colecciones y cadenas, como assertIterableEquals para comparar iterables y assertLinesMatch para comparar arrays de strings. Por último, aunque no profundizamos en ellos aquí, assertThrows y assertDoesNotThrow son muy prácticos para verificar si un bloque de código lanza o no una excepción, aprovechando la sintaxis concisa que ofrece Java 8 con funciones lambda.
Estas herramientas nos permiten escribir tests más robustos y expresivos, facilitando la detección de errores y mejorando la calidad de nuestro código.