En esta sección, aprenderemos sobre las anotaciones @Before y @After en JUnit. Estas anotaciones son fundamentales para preparar y limpiar el entorno de pruebas antes y después de cada test. Esto es especialmente útil cuando necesitas configurar un estado inicial o liberar recursos después de que un test se ha ejecutado.
¿Qué son @Before y @After?
- @Before: Esta anotación se utiliza para marcar un método que debe ejecutarse antes de cada método de prueba (
@Test). Es ideal para inicializar objetos, abrir conexiones, o cualquier otra configuración necesaria antes de ejecutar un test. - @After: Esta anotación se utiliza para marcar un método que debe ejecutarse después de cada método de prueba (
@Test). Es útil para liberar recursos, cerrar conexiones, o cualquier otra limpieza necesaria después de ejecutar un test.
Ejemplo Práctico
Vamos a ver un ejemplo práctico para entender cómo funcionan estas anotaciones.
Código de Ejemplo
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class CalculadoraTest {
private Calculadora calculadora;
@Before
public void setUp() {
// Este método se ejecuta antes de cada test
calculadora = new Calculadora();
System.out.println("Configurando el entorno de prueba...");
}
@After
public void tearDown() {
// Este método se ejecuta después de cada test
calculadora = null;
System.out.println("Limpiando el entorno de prueba...");
}
@Test
public void testSuma() {
int resultado = calculadora.suma(2, 3);
assertEquals(5, resultado);
}
@Test
public void testResta() {
int resultado = calculadora.resta(5, 3);
assertEquals(2, resultado);
}
}Explicación del Código
-
Declaración de la Clase y Variables:
public class CalculadoraTest { private Calculadora calculadora; }- Declaramos una clase de prueba
CalculadoraTesty una variablecalculadoraque será utilizada en los tests.
- Declaramos una clase de prueba
-
Método
setUpcon @Before:@Before public void setUp() { calculadora = new Calculadora(); System.out.println("Configurando el entorno de prueba..."); }- El método
setUpestá anotado con@Before, lo que significa que se ejecutará antes de cada método de prueba. - Aquí, inicializamos la instancia de
Calculadora.
- El método
-
Método
tearDowncon @After:@After public void tearDown() { calculadora = null; System.out.println("Limpiando el entorno de prueba..."); }- El método
tearDownestá anotado con@After, lo que significa que se ejecutará después de cada método de prueba. - Aquí, liberamos la instancia de
Calculadora.
- El método
-
Métodos de Prueba:
@Test public void testSuma() { int resultado = calculadora.suma(2, 3); assertEquals(5, resultado); } @Test public void testResta() { int resultado = calculadora.resta(5, 3); assertEquals(2, resultado); }- Los métodos
testSumaytestRestason métodos de prueba anotados con@Test. - Cada uno de estos métodos se ejecutará después de
setUpy antes detearDown.
- Los métodos
Ejercicio Práctico
Ejercicio
Crea una clase de prueba para una clase Banco que tenga métodos para depositar y retirar dinero. Usa las anotaciones @Before y @After para inicializar y limpiar el estado del objeto Banco.
Solución
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class BancoTest {
private Banco banco;
@Before
public void setUp() {
banco = new Banco();
banco.depositar(1000);
System.out.println("Configurando el entorno de prueba...");
}
@After
public void tearDown() {
banco = null;
System.out.println("Limpiando el entorno de prueba...");
}
@Test
public void testDepositar() {
banco.depositar(500);
assertEquals(1500, banco.getSaldo());
}
@Test
public void testRetirar() {
banco.retirar(200);
assertEquals(800, banco.getSaldo());
}
}Explicación de la Solución
-
Inicialización en
setUp:- Se crea una instancia de
Bancoy se deposita un saldo inicial de 1000 unidades antes de cada test.
- Se crea una instancia de
-
Limpieza en
tearDown:- Se libera la instancia de
Bancodespués de cada test.
- Se libera la instancia de
-
Métodos de Prueba:
testDepositarverifica que el saldo se actualiza correctamente después de un depósito.testRetirarverifica que el saldo se actualiza correctamente después de una retirada.
Conclusión
Las anotaciones @Before y @After son herramientas poderosas en JUnit que te permiten preparar y limpiar el entorno de pruebas de manera eficiente. Esto asegura que cada test se ejecute en un estado controlado y predecible, lo que es crucial para obtener resultados de prueba confiables.
En la siguiente sección, exploraremos las anotaciones @BeforeClass y @AfterClass, que se utilizan para configurar y limpiar el entorno de pruebas a nivel de clase.
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
