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:

  1. En el pom.xml, debemos indicarle a Maven que excluya la versión antigua de JUnit.
  2. En el pom.xml, debermos incluir la nueva versión de JUnit 5 a nuestro classpath.
  3. 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:

  1. La anotación @RunWith al Test ahora es reemplazada por @ExtendWith, y hay una nueva clase de soporte para Spring.
  2. Las anotaciones @Test ahora están en un paquete diferente.
  3. Los asserts ahora están en otro paquete, y usan un api diferente.
  4. Las excepciones ahora se tratan directamente dentro del cuerpo del método de Test (y no con un atributo en la anotación).
  5. 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");
    }
}

 

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!