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étodomethodThatThrowsExceptionlance 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
assertThrowsIntroducido 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
Calculatorcon un métododivide(int a, int b)que lance unaArithmeticExceptionsibes 0. - Escribe una prueba que verifique que se lanza una
ArithmeticExceptioncuandobes 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-catchyfail()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
