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étodo- methodThatThrowsExceptionlance una- IllegalArgumentException.
- Usando try-catchyfail()
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 una- IllegalArgumentException.
- 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-catchy- fail()
- 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
