La migración de JUnit 4 a JUnit 5 puede parecer una tarea desalentadora, pero con una comprensión clara de las diferencias y las nuevas características, el proceso puede ser bastante manejable. En esta sección, cubriremos los pasos necesarios para migrar tus pruebas de JUnit 4 a JUnit 5, destacando las diferencias clave y proporcionando ejemplos prácticos.

Diferencias Clave entre JUnit 4 y JUnit 5

Antes de comenzar la migración, es importante entender las diferencias clave entre JUnit 4 y JUnit 5:

  1. Arquitectura Modular:

    • JUnit 5 está compuesto por tres subproyectos: JUnit Platform, JUnit Jupiter y JUnit Vintage.
    • JUnit 4 es un monolito, mientras que JUnit 5 permite una mayor flexibilidad y extensibilidad.
  2. Anotaciones:

    • JUnit 5 introduce nuevas anotaciones y cambia algunas de las existentes.
    • Ejemplo: @Before y @After en JUnit 4 se reemplazan por @BeforeEach y @AfterEach en JUnit 5.
  3. Aserciones y Suposiciones:

    • JUnit 5 proporciona un conjunto más rico de aserciones y suposiciones.
  4. Soporte para Programación Funcional:

    • JUnit 5 permite el uso de expresiones lambda y referencias a métodos, lo que facilita la escritura de pruebas más concisas y legibles.

Paso 1: Actualizar las Dependencias

Lo primero que debes hacer es actualizar las dependencias de tu proyecto para incluir JUnit 5. Aquí hay un ejemplo de cómo hacerlo con Maven y Gradle.

Maven

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

Gradle

testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

Paso 2: Migrar Anotaciones

Las anotaciones en JUnit 5 han cambiado ligeramente. Aquí hay una tabla comparativa de las anotaciones más comunes:

JUnit 4 JUnit 5
@BeforeClass @BeforeAll
@AfterClass @AfterAll
@Before @BeforeEach
@After @AfterEach
@Ignore @Disabled
@Test(expected) assertThrows
@Test(timeout) @Test con assertTimeout

Ejemplo de Migración de Anotaciones

JUnit 4

import org.junit.Before;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.AfterClass;
import org.junit.Test;
import static org.junit.Assert.*;

public class ExampleTest {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        // Código de configuración antes de todos los tests
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        // Código de limpieza después de todos los tests
    }

    @Before
    public void setUp() throws Exception {
        // Código de configuración antes de cada test
    }

    @After
    public void tearDown() throws Exception {
        // Código de limpieza después de cada test
    }

    @Test
    public void testExample() {
        assertEquals(1, 1);
    }
}

JUnit 5

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class ExampleTest {
    @BeforeAll
    public static void setUpBeforeClass() throws Exception {
        // Código de configuración antes de todos los tests
    }

    @AfterAll
    public static void tearDownAfterClass() throws Exception {
        // Código de limpieza después de todos los tests
    }

    @BeforeEach
    public void setUp() throws Exception {
        // Código de configuración antes de cada test
    }

    @AfterEach
    public void tearDown() throws Exception {
        // Código de limpieza después de cada test
    }

    @Test
    public void testExample() {
        assertEquals(1, 1);
    }
}

Paso 3: Migrar Aserciones y Suposiciones

JUnit 5 proporciona un conjunto más rico de aserciones y suposiciones. Aquí hay algunos ejemplos de cómo migrar aserciones comunes.

Aserciones

JUnit 4

import static org.junit.Assert.*;

public class AssertionTest {
    @Test
    public void testAssertions() {
        assertEquals("failure - strings are not equal", "text", "text");
        assertTrue("failure - should be true", true);
        assertFalse("failure - should be false", false);
    }
}

JUnit 5

import static org.junit.jupiter.api.Assertions.*;

public class AssertionTest {
    @Test
    public void testAssertions() {
        assertEquals("text", "text", "failure - strings are not equal");
        assertTrue(true, "failure - should be true");
        assertFalse(false, "failure - should be false");
    }
}

Suposiciones

JUnit 4

import static org.junit.Assume.*;

public class AssumptionTest {
    @Test
    public void testAssumptions() {
        assumeTrue(System.getProperty("os.name").startsWith("Windows"));
        // Test code that should only run on Windows
    }
}

JUnit 5

import static org.junit.jupiter.api.Assumptions.*;

public class AssumptionTest {
    @Test
    public void testAssumptions() {
        assumeTrue(System.getProperty("os.name").startsWith("Windows"));
        // Test code that should only run on Windows
    }
}

Paso 4: Ejecutar y Verificar

Una vez que hayas migrado tus pruebas, es importante ejecutarlas y verificar que todo funcione correctamente. JUnit 5 es compatible con la mayoría de los entornos de construcción y herramientas de CI/CD, por lo que no deberías tener problemas para integrarlo en tu flujo de trabajo existente.

Conclusión

Migrar de JUnit 4 a JUnit 5 puede requerir un esfuerzo inicial, pero las mejoras en la flexibilidad, la extensibilidad y las nuevas características de JUnit 5 hacen que valga la pena. Al seguir los pasos descritos en esta sección, deberías poder realizar la transición de manera efectiva y aprovechar al máximo las capacidades avanzadas de JUnit 5.

Recuerda siempre ejecutar tus pruebas después de cada cambio para asegurarte de que todo funcione como se espera. ¡Buena suerte con tu migración!

© Copyright 2024. Todos los derechos reservados