Introducción

Las suposiciones en JUnit permiten que los tests se ejecuten solo si se cumplen ciertas condiciones. Esto es útil cuando se desea evitar la ejecución de tests en entornos específicos o bajo ciertas circunstancias que no son relevantes para el test en cuestión. JUnit proporciona varias anotaciones y métodos para trabajar con suposiciones.

Conceptos Clave

  • Suposiciones: Condiciones que deben cumplirse para que un test se ejecute.
  • Anotaciones: JUnit proporciona anotaciones específicas para definir suposiciones.
  • Métodos de Suposición: Métodos que permiten verificar condiciones antes de ejecutar un test.

Métodos de Suposición

JUnit ofrece varios métodos para trabajar con suposiciones, los más comunes son:

  • assumeTrue(boolean condition): El test se ejecuta solo si la condición es verdadera.
  • assumeFalse(boolean condition): El test se ejecuta solo si la condición es falsa.
  • assumeThat(T actual, Matcher<? super T> matcher): El test se ejecuta solo si el valor actual cumple con el matcher proporcionado.

Ejemplo Práctico

A continuación, se muestra un ejemplo práctico de cómo utilizar suposiciones en JUnit:

import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeThat;
import static org.hamcrest.CoreMatchers.is;
import org.junit.jupiter.api.Test;

public class AssumptionsTest {

    @Test
    void testOnlyOnCiServer() {
        // Suposición: El test se ejecuta solo si la variable de entorno "CI" está configurada como "true"
        assumeTrue("true".equals(System.getenv("CI")));
        // Código del test
        System.out.println("Este test se ejecuta solo en el servidor de integración continua.");
    }

    @Test
    void testOnlyOnDeveloperMachine() {
        // Suposición: El test se ejecuta solo si la variable de entorno "CI" no está configurada como "true"
        assumeFalse("true".equals(System.getenv("CI")));
        // Código del test
        System.out.println("Este test se ejecuta solo en la máquina del desarrollador.");
    }

    @Test
    void testAssumeThat() {
        // Suposición: El test se ejecuta solo si el valor es igual a 5
        assumeThat(5, is(5));
        // Código del test
        System.out.println("Este test se ejecuta porque la suposición es verdadera.");
    }
}

Explicación del Código

  1. Importaciones: Se importan las clases necesarias para trabajar con suposiciones y matchers.
  2. testOnlyOnCiServer: Este test se ejecuta solo si la variable de entorno "CI" está configurada como "true". Si la suposición falla, el test se omite.
  3. testOnlyOnDeveloperMachine: Este test se ejecuta solo si la variable de entorno "CI" no está configurada como "true". Si la suposición falla, el test se omite.
  4. testAssumeThat: Este test se ejecuta solo si el valor es igual a 5. Si la suposición falla, el test se omite.

Ejercicio Práctico

Ejercicio 1

Escribe un test que se ejecute solo si la versión de Java es 11 o superior.

import static org.junit.jupiter.api.Assumptions.assumeTrue;
import org.junit.jupiter.api.Test;

public class JavaVersionTest {

    @Test
    void testOnlyOnJava11OrHigher() {
        // Suposición: El test se ejecuta solo si la versión de Java es 11 o superior
        assumeTrue(System.getProperty("java.version").startsWith("11") || 
                   System.getProperty("java.version").startsWith("12") || 
                   System.getProperty("java.version").startsWith("13") || 
                   System.getProperty("java.version").startsWith("14") || 
                   System.getProperty("java.version").startsWith("15") || 
                   System.getProperty("java.version").startsWith("16") || 
                   System.getProperty("java.version").startsWith("17"));
        // Código del test
        System.out.println("Este test se ejecuta solo en Java 11 o superior.");
    }
}

Solución

import static org.junit.jupiter.api.Assumptions.assumeTrue;
import org.junit.jupiter.api.Test;

public class JavaVersionTest {

    @Test
    void testOnlyOnJava11OrHigher() {
        // Suposición: El test se ejecuta solo si la versión de Java es 11 o superior
        assumeTrue(System.getProperty("java.version").startsWith("11") || 
                   System.getProperty("java.version").startsWith("12") || 
                   System.getProperty("java.version").startsWith("13") || 
                   System.getProperty("java.version").startsWith("14") || 
                   System.getProperty("java.version").startsWith("15") || 
                   System.getProperty("java.version").startsWith("16") || 
                   System.getProperty("java.version").startsWith("17"));
        // Código del test
        System.out.println("Este test se ejecuta solo en Java 11 o superior.");
    }
}

Conclusión

Las suposiciones en JUnit son una herramienta poderosa para controlar la ejecución de tests bajo ciertas condiciones. Esto es especialmente útil en entornos de desarrollo y pruebas donde ciertas condiciones pueden no ser relevantes o aplicables. Al utilizar suposiciones, puedes asegurarte de que tus tests se ejecuten solo cuando sea necesario, mejorando así la eficiencia y relevancia de tus pruebas.

En el siguiente tema, exploraremos los Tests Dinámicos en JUnit, una característica avanzada que permite generar tests de manera programática.

© Copyright 2024. Todos los derechos reservados