JUnit 5 es la nueva versión del framework de testing para Java, que trae muchísimos cambios y mejoras... y es muy tentandor para empezar a usar. Sin embargo, si usamos Spring Boot sabemos que todavía no hay soporte directo para JUnit 5. Por suerte, vamos a ver que con unos pequeños cambios podemos aprovechar esta nueva versión del framework.
Prepara el pom
Spring Boot 2.1.x (y otras versiones anteriores) usan JUnit 4 como dependencia, la cual se trae automáticmente al incorporar el spring-boot-starter-test. Por lo tanto, tendremos que realizar los cambios en 3 pasos:
- En el
pom.xml
, debemos indicarle a Maven que excluya la versión antigua de JUnit. - En el
pom.xml
, debermos incluir la nueva versión de JUnit 5 a nuestro classpath. - Debemos realizar las modificaciones a nuestras clases de test para usar los nuevos paquetes de JUnit 5.
Editando el pom.xml
En nuestro pom.xml debemos entonces excluir la versión vieja de JUnit e incorporar manualmente la nueva. Para esto:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
Adaptando las clases de test
La nueva versión de JUnit utiliza paquetes y una estructura diferente para las anotaciones y demás. En particular, debemos realizar los siguientes grandes cambios:
- La anotación
@RunWith
al Test ahora es reemplazada por@ExtendWith
, y hay una nueva clase de soporte para Spring. - Las anotaciones
@Test
ahora están en un paquete diferente. - Los asserts ahora están en otro paquete, y usan un api diferente.
- Las excepciones ahora se tratan directamente dentro del cuerpo del método de Test (y no con un atributo en la anotación).
- Las anotaciones
@Before
y@After
ahora son@BeforeEach
y@AfterEach
Una clase de ejemplo con JUnit 5 que utiliza varias características para poder comparar y adaptar:
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
@SpringBootTest
@ExtendWith(SpringExtension.class)
public abstract class TiendalWebApplicationTests {
@Test
public void buscarPorEdadMayorA_edadValida_retornaPersonas() {
List<Persona> personas = personaService.buscarPorEdadMayorA(18);
assertThat(personas)
.isNotEmpty()
.allMatch(persona -> persona.getEdad() > 18);
}
@Test
public void buscarPorEdadMayorA_edadNull_lanzaExcepcion() {
assertThatIllegalArgumentException().isThrownBy(()
-> personaService.buscarPorEdadMayorA(null))
.withMessage("La edad indicada es inválida");
}
}