En este tema, aprenderemos cómo crear nuestras propias aserciones personalizadas en JUnit. Las aserciones personalizadas son útiles cuando queremos verificar condiciones específicas que no están cubiertas por las aserciones estándar de JUnit. Esto nos permite escribir tests más legibles y específicos para nuestras necesidades.

¿Por qué usar Aserciones Personalizadas?

Las aserciones personalizadas pueden:

  • Mejorar la legibilidad de los tests.
  • Proveer mensajes de error más claros y específicos.
  • Reutilizar lógica de verificación compleja en múltiples tests.

Creando una Aserción Personalizada

Para crear una aserción personalizada, seguiremos estos pasos:

  1. Definir la lógica de la aserción: Especificar qué condiciones queremos verificar.
  2. Crear un método de aserción: Implementar la lógica en un método estático.
  3. Usar la aserción personalizada en nuestros tests: Llamar al método de aserción en nuestros tests.

Ejemplo Práctico

Supongamos que tenemos una clase Person y queremos verificar que el nombre de la persona no esté vacío y que la edad sea mayor que 0.

public class Person {
    private String name;
    private int age;

    // Constructor, getters y setters
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Paso 1: Definir la Lógica de la Aserción

Queremos verificar que:

  • El nombre no esté vacío.
  • La edad sea mayor que 0.

Paso 2: Crear un Método de Aserción

Implementamos la lógica en un método estático en una clase de utilidades de aserción.

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

public class PersonAssertions {

    public static void assertValidPerson(Person person) {
        assertNotNull(person, "La persona no debe ser nula");
        assertFalse(person.getName().isEmpty(), "El nombre no debe estar vacío");
        assertTrue(person.getAge() > 0, "La edad debe ser mayor que 0");
    }
}

Paso 3: Usar la Aserción Personalizada en Nuestros Tests

Ahora podemos usar nuestra aserción personalizada en nuestros tests.

import org.junit.jupiter.api.Test;

public class PersonTest {

    @Test
    public void testValidPerson() {
        Person person = new Person("John Doe", 30);
        PersonAssertions.assertValidPerson(person);
    }

    @Test
    public void testInvalidPerson() {
        Person person = new Person("", -1);
        Exception exception = assertThrows(AssertionError.class, () -> {
            PersonAssertions.assertValidPerson(person);
        });
        assertTrue(exception.getMessage().contains("El nombre no debe estar vacío"));
    }
}

Ejercicio Práctico

Ejercicio 1: Crear una Aserción Personalizada para una Clase Product

  1. Definir la clase Product:

    public class Product {
        private String name;
        private double price;
    
        // Constructor, getters y setters
        public Product(String name, double price) {
            this.name = name;
            this.price = price;
        }
    
        public String getName() {
            return name;
        }
    
        public double getPrice() {
            return price;
        }
    }
    
  2. Crear una aserción personalizada assertValidProduct:

    • Verificar que el nombre no esté vacío.
    • Verificar que el precio sea mayor que 0.
  3. Escribir tests que usen la aserción personalizada.

Solución

  1. Clase Product:

    public class Product {
        private String name;
        private double price;
    
        public Product(String name, double price) {
            this.name = name;
            this.price = price;
        }
    
        public String getName() {
            return name;
        }
    
        public double getPrice() {
            return price;
        }
    }
    
  2. Aserción Personalizada:

    import static org.junit.jupiter.api.Assertions.*;
    
    public class ProductAssertions {
    
        public static void assertValidProduct(Product product) {
            assertNotNull(product, "El producto no debe ser nulo");
            assertFalse(product.getName().isEmpty(), "El nombre del producto no debe estar vacío");
            assertTrue(product.getPrice() > 0, "El precio del producto debe ser mayor que 0");
        }
    }
    
  3. Tests:

    import org.junit.jupiter.api.Test;
    
    public class ProductTest {
    
        @Test
        public void testValidProduct() {
            Product product = new Product("Laptop", 999.99);
            ProductAssertions.assertValidProduct(product);
        }
    
        @Test
        public void testInvalidProduct() {
            Product product = new Product("", -100);
            Exception exception = assertThrows(AssertionError.class, () -> {
                ProductAssertions.assertValidProduct(product);
            });
            assertTrue(exception.getMessage().contains("El nombre del producto no debe estar vacío"));
        }
    }
    

Conclusión

Las aserciones personalizadas en JUnit nos permiten crear verificaciones específicas y reutilizables que mejoran la legibilidad y mantenibilidad de nuestros tests. Al seguir los pasos para definir, implementar y usar aserciones personalizadas, podemos asegurarnos de que nuestras pruebas sean más claras y efectivas. En el siguiente módulo, exploraremos los tests parametrizados, que nos permitirán ejecutar el mismo test con diferentes conjuntos de datos.

© Copyright 2024. Todos los derechos reservados