En este módulo, aprenderemos cómo manejar y probar excepciones en JUnit. Las pruebas de excepciones son cruciales para asegurarnos de que nuestro código maneje adecuadamente las situaciones de error.
Conceptos Clave
- Excepciones: Son eventos que ocurren durante la ejecución de un programa y que interrumpen el flujo normal de las instrucciones.
- Testing de Excepciones: Proceso de verificar que el código lanza las excepciones esperadas bajo condiciones específicas.
Métodos para Probar Excepciones en JUnit
- Usando
@Test(expected = Exception.class)
@Test(expected = Exception.class)
Esta es una forma sencilla de probar si un método lanza una excepción específica.
import org.junit.Test; public class ExceptionTest { @Test(expected = IllegalArgumentException.class) public void testExceptionIsThrown() { MyClass myClass = new MyClass(); myClass.methodThatThrowsException(); } }
Explicación:
@Test(expected = IllegalArgumentException.class)
: Indica que se espera que el métodomethodThatThrowsException
lance unaIllegalArgumentException
.
- Usando
try-catch
y fail()
try-catch
y fail()
Este método proporciona más control y permite verificar el mensaje de la excepción.
import org.junit.Test; import static org.junit.Assert.fail; public class ExceptionTest { @Test public void testExceptionMessage() { MyClass myClass = new MyClass(); try { myClass.methodThatThrowsException(); fail("Expected IllegalArgumentException to be thrown"); } catch (IllegalArgumentException e) { assertEquals("Invalid argument", e.getMessage()); } } }
Explicación:
try-catch
: Intenta ejecutar el método y captura la excepción.fail("Expected IllegalArgumentException to be thrown")
: Falla la prueba si no se lanza la excepción.assertEquals("Invalid argument", e.getMessage())
: Verifica que el mensaje de la excepción sea el esperado.
- Usando
assertThrows
assertThrows
Introducido en JUnit 5, assertThrows
es una forma más moderna y limpia de probar excepciones.
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; public class ExceptionTest { @Test public void testExceptionIsThrown() { MyClass myClass = new MyClass(); IllegalArgumentException thrown = assertThrows( IllegalArgumentException.class, () -> myClass.methodThatThrowsException(), "Expected methodThatThrowsException() to throw, but it didn't" ); assertEquals("Invalid argument", thrown.getMessage()); } }
Explicación:
assertThrows(IllegalArgumentException.class, () -> myClass.methodThatThrowsException())
: Verifica que se lance unaIllegalArgumentException
.assertEquals("Invalid argument", thrown.getMessage())
: Verifica el mensaje de la excepción.
Ejercicio Práctico
Ejercicio 1: Probar Excepciones con @Test(expected)
- Crea una clase
Calculator
con un métododivide(int a, int b)
que lance unaArithmeticException
sib
es 0. - Escribe una prueba que verifique que se lanza una
ArithmeticException
cuandob
es 0.
public class Calculator { public int divide(int a, int b) { if (b == 0) { throw new ArithmeticException("Cannot divide by zero"); } return a / b; } }
import org.junit.Test; public class CalculatorTest { @Test(expected = ArithmeticException.class) public void testDivideByZero() { Calculator calculator = new Calculator(); calculator.divide(10, 0); } }
Ejercicio 2: Probar Excepciones con assertThrows
- Modifica la prueba anterior para usar
assertThrows
.
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; public class CalculatorTest { @Test public void testDivideByZero() { Calculator calculator = new Calculator(); ArithmeticException thrown = assertThrows( ArithmeticException.class, () -> calculator.divide(10, 0), "Expected divide(10, 0) to throw, but it didn't" ); assertEquals("Cannot divide by zero", thrown.getMessage()); } }
Resumen
En esta sección, hemos aprendido cómo probar excepciones en JUnit utilizando diferentes métodos:
@Test(expected = Exception.class)
try-catch
yfail()
assertThrows
Cada método tiene sus ventajas y desventajas, y la elección del método depende de la situación específica y de las necesidades del test. Con estos conocimientos, estarás mejor preparado para manejar y probar excepciones en tus proyectos de Java.
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