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:
- Definir la lógica de la aserción: Especificar qué condiciones queremos verificar.
- Crear un método de aserción: Implementar la lógica en un método estático.
- 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
-
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; } }
-
Crear una aserción personalizada
assertValidProduct
:- Verificar que el nombre no esté vacío.
- Verificar que el precio sea mayor que 0.
-
Escribir tests que usen la aserción personalizada.
Solución
-
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; } }
-
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"); } }
-
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.
Curso de JUnit
Módulo 1: Introducción a JUnit
Módulo 2: Anotaciones Básicas de JUnit
- Entendiendo @Test
- Usando @Before y @After
- Usando @BeforeClass y @AfterClass
- Ignorando Tests con @Ignore
Módulo 3: Aserciones en JUnit
Módulo 4: Tests Parametrizados
- Introducción a los Tests Parametrizados
- Creando Tests Parametrizados
- Usando @ParameterizedTest
- Tests Parametrizados Personalizados
Módulo 5: Suites de Tests
Módulo 6: Mocking con JUnit
Módulo 7: Características Avanzadas de JUnit
Módulo 8: Mejores Prácticas y Consejos
- Escribiendo Tests Efectivos
- Organizando el Código de Tests
- Desarrollo Guiado por Tests (TDD)
- Integración Continua con JUnit