AssertJ es, llanamente, una librería para escribir aserciones fluidas y completas en pruebas Java.
Según la documentación oficial, se compone de varios módulos:
- Un módulo central para proporcionar afirmaciones para tipos JDK (Cadena, Iterable, Transmisión, Ruta, Archivo, Mapa, etc.).
- Un módulo de Guava para proporcionar afirmaciones para tipos de Guava (Multimap, Opcional, etc.).
- Un módulo Joda Time para proporcionar afirmaciones para los tipos Joda Time (DateTime, LocalDateTime).
- Un módulo Neo4J para proporcionar afirmaciones para los tipos Neo4J (Ruta, Nodo, Relación, etc.).
- Un módulo de base de datos para proporcionar afirmaciones para tipos de bases de datos relacionales (tabla, fila, columna, etc.)
- Un módulo Swing proporciona una API simple e intuitiva para pruebas funcionales de interfaces de usuario Swing.
AssertJ proporciona un amplio conjunto de afirmaciones y mensajes de error verdaderamente útiles, mejora la legibilidad del código de prueba y está diseñada para ser muy fácil de usar dentro de su IDE favorito (Eclipse IDE, IntelliJ IDEA, etc.).
¿Cómo la importamos?
En Maven:
<dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.27.6</version> <scope>test</scope> </dependency>
En Gradle:
testImplementation("org.assertj:assertj-core:3.27.6")
Si tenemos un proyecto Spring Boot, es necesario agregar estas líneas.
En Maven, en el pom.xml
<properties> <assertj.version>3.27.6</assertj.version> </properties>
En Gradle, en el build.gradle
ext['assertj.version'] = '3.27.6'
AssertJ y JUnit se pueden usar en conjunto. Ambas herramientas son complementarias.
Lo podemos importar de esta manera:
import static org.assertj.core.api.Assertions.*;
O de esta forma:
import static org.assertj.core.api.Assertions.assertThat; // main one import static org.assertj.core.api.Assertions.atIndex; // for List assertions import static org.assertj.core.api.Assertions.entry; // for Map assertions import static org.assertj.core.api.Assertions.tuple; // when extracting several properties at once import static org.assertj.core.api.Assertions.fail; // use when writing exception tests import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; // idem import static org.assertj.core.api.Assertions.filter; // for Iterable/Array assertions import static org.assertj.core.api.Assertions.offset; // for floating number assertions import static org.assertj.core.api.Assertions.anyOf; // use with Condition import static org.assertj.core.api.Assertions.contentOf; // use with File assertions
Pero antes de hacer nada, ¿Qué son las aserciones?
En sencillas palabras, son declaraciones que verifican si una condición es verdadera en un punto específico del código.
Hagamos un ejemplo.
Supongamos que queremos validar un String con este contenido "El Alquimista de codigo":
MainTest.java
package com.inforhomex.app; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import com.inforhomex.app.Main; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import static org.junit.jupiter.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; public class MainTest { @Test public void aSimpleTest(){ // Pasa assertThat("El Alquimista de codigo").isNotNull() .startsWith("El") .contains("Alquimista") .endsWith("codigo"); } }
El método ``assertThat`` evalua la cadena y verifica si no es nula (isNotNull), si inicia con la palabra "El" (startsWith), si contiene la palabra "Alquimista" (contains) y si termina en la palabra "codigo" (endsWith).
Supongamos que queremos validar que una fecha contiene un determinado día de la semana y año. Tendríamos el siguiente bloque:
package com.inforhomex.app; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import com.inforhomex.app.Main; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import static org.junit.jupiter.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; public class MainTest { @Test public void aSimpleTest(){ //... LocalDate hoy = LocalDate.of(2025, 10, 20); assertThat(hoy) .hasYear(2025) .hasDayOfMonth(20); } }
En este bloque validamos la fecha "2025-10-20". El método ``assertThat`` evalua si contiene el año 2025 (hasYear) y el día de la semana igual a 20 (hasDayOfMonth). Tal aserción será verdadera, pero ¿Qué tal si fuera errónea?
package com.inforhomex.app; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import com.inforhomex.app.Main; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import static org.junit.jupiter.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; public class MainTest { @Test public void aSimpleTest(){ //... LocalDate hoy = LocalDate.of(2025, 10, 20); assertThat(hoy) .hasYear(2028) .hasDayOfMonth(20); } }
Si ejecutamos la prueba:
$ mvn test
El resultado será el siguiente:
[ERROR] Tests run: 4, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 13.64 s <<< FAILURE! -- in com.inforhomex.app.MainTest [ERROR] com.inforhomex.app.MainTest.aSimpleTest -- Time elapsed: 10.00 s <<< FAILURE! java.lang.AssertionError: Expecting actual: 2025-10-20 (java.time.LocalDate) to be on "year" 2028 at com.inforhomex.app.MainTest.aSimpleTest(MainTest.java:67) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) [INFO] [INFO] Results: [INFO] [ERROR] Failures: [ERROR] MainTest.aSimpleTest:67 Expecting actual: 2025-10-20 (java.time.LocalDate) to be on "year" 2028 [INFO] [ERROR] Tests run: 4, Failures: 1, Errors: 0, Skipped: 0
La prueba fallará, pues no se encuentra el año "2028" en la fecha "2025-10-20".
Evaluemos una lista tipo String.
package com.inforhomex.app; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import com.inforhomex.app.Main; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import static org.junit.jupiter.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; import java.util.Arrays; public class MainTest { @Test public void aSimpleTest(){ //... List<String> lista = Arrays.asList("10","20","30"); assertThat(lista).hasSize(3) .contains("20",lista.get(1)) .doesNotContain("50"); } }
Al ejecutar el test:
$ mvn test
Este será el resultado:
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.653 s -- in com.inforhomex.app.MainTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ------------------------------------------------------------------------
Pues la evaluación del tamaño, si contiene o no un elemento fue correcta.
AssertJ es una herramienta que nos ayuda con nuestras pruebas de código Java. Se puede emplear en conjunto con JUnit, Mockito y Wiremock sin problema alguno. Continuaremos con este tema en próximas entregas.
Enlaces:
https://assertj.github.io/https://www.baeldung.com/introduction-to-assertj
https://annaduldiier.medium.com/assertj-vs-junit-483b7d6dc997
https://mkyong.com/junit5/junit-5-assertj-examples/
https://es.wikipedia.org/wiki/Aserci%C3%B3n_(inform%C3%A1tica)
Comentarios
Publicar un comentario