Cómo aprovechar la clase Assertions de JUnit 5

JUnit tiene una biblioteca de asertos muy grande con la que se pueden escribir muchas comprobaciones. En este vídeo te cuento algunas de las más interesantes que hay. Con assertAll() se puede crear un aserto compuesto que ejecuta varios sub-asertos esperando que todos pasen. Con assertTimeout() podemos validar que un código se ejecuta en un intervalo de tiempo acotado. Y con assertArrayEquals() podemos comprobar de forma efectiva arrays.

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.

Lista de reproducción
  1. 1
    ¿Qué es una prueba unitaria? ¿Me vale con crear un main?
    7 minutos
  2. 2
    Cómo crear tests unitarios con JUnit 5
    17 minutos
  3. 3
    Cómo usar BeforeEach, AfterEach, BeforeAll y AfterAll en JUnit 5
    11 minutos
  4. 4
    Cómo cambiar el orden de los tests de JUnit 5 (aunque no deberías)
    8 minutos
  5. 5
    Cómo aprovechar la clase Assertions de JUnit 5
    8 minutos
  6. 6
    Cómo ejecutar tests condicionalmente en JUnit 5
    7 minutos
  7. 7
    Cómo hacer tests de excepciones en JUnit 5 con assertThrows
    5 minutos
  8. 8
    Cómo crear Nested tests en JUnit 5 (un test dentro de otro)
    5 minutos
  9. 9
    Cómo configurar y crear tests de JUnit 5 en NetBeans
    6 minutos
  10. 10
    Cómo configurar y crear tests de JUnit 5 en Eclipse
    5 minutos
  11. 11
    Cómo configurar y crear tests de JUnit 5 en IntelliJ IDEA
    4 minutos