En aquest tema, aprendrem com gestionar i verificar excepcions en els nostres tests de JUnit. Les excepcions són una part important de la programació en Java, i és crucial assegurar-se que el nostre codi maneja les excepcions correctament. JUnit proporciona diverses maneres de testejar excepcions, i en aquesta secció explorarem les més comunes.
Continguts
Introducció a les Excepcions
Les excepcions són esdeveniments que interrompen el flux normal d'execució d'un programa. En Java, les excepcions es poden gestionar utilitzant blocs try-catch
. Quan escrivim tests, volem assegurar-nos que el nostre codi llança les excepcions correctes en les situacions adequades.
Testejar Excepcions amb assertThrows
JUnit 5 introdueix el mètode assertThrows
, que és una manera elegant i clara de testejar excepcions. Aquest mètode verifica que una excepció específica és llançada durant l'execució d'un bloc de codi.
Sintaxi
import static org.junit.jupiter.api.Assertions.assertThrows; @Test void testException() { Exception exception = assertThrows(ExpectedException.class, () -> { // Codi que llança l'excepció }); // Opcional: Verificar el missatge de l'excepció assertEquals("Missatge d'error esperat", exception.getMessage()); }
Exemple
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; public class ExceptionTest { @Test void testDivisionByZero() { ArithmeticException exception = assertThrows(ArithmeticException.class, () -> { int result = 10 / 0; }); assertEquals("/ by zero", exception.getMessage()); } }
Testejar Excepcions amb @Test(expected)
En JUnit 4, es pot utilitzar l'anotació @Test
amb l'atribut expected
per indicar que una excepció específica ha de ser llançada durant l'execució del test.
Sintaxi
import org.junit.Test; @Test(expected = ExpectedException.class) public void testException() { // Codi que llança l'excepció }
Exemple
import org.junit.Test; public class ExceptionTest { @Test(expected = ArithmeticException.class) public void testDivisionByZero() { int result = 10 / 0; } }
Exemple Pràctic
A continuació, veurem un exemple pràctic que utilitza assertThrows
per testejar una excepció personalitzada.
Codi de la Classe
public class Calculator { public int divide(int a, int b) { if (b == 0) { throw new IllegalArgumentException("Divisor cannot be zero"); } return a / b; } }
Codi del Test
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; public class CalculatorTest { @Test void testDivideByZero() { Calculator calculator = new Calculator(); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { calculator.divide(10, 0); }); assertEquals("Divisor cannot be zero", exception.getMessage()); } }
Exercicis Pràctics
-
Exercici 1: Escriu un test que verifiqui que una excepció
NullPointerException
és llançada quan es passa un valornull
a un mètode que no accepta valors nuls. -
Exercici 2: Escriu un test que verifiqui que una excepció
IndexOutOfBoundsException
és llançada quan es tracta d'accedir a un índex fora dels límits d'una llista.
Solucions
Exercici 1:
import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; public class NullPointerTest { @Test void testNullPointer() { String str = null; assertThrows(NullPointerException.class, () -> { str.length(); }); } }
Exercici 2:
import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; public class IndexOutOfBoundsTest { @Test void testIndexOutOfBounds() { List<String> list = new ArrayList<>(); list.add("item1"); assertThrows(IndexOutOfBoundsException.class, () -> { list.get(1); }); } }
Conclusió
En aquesta secció, hem après com testejar excepcions utilitzant JUnit. Hem vist com utilitzar assertThrows
en JUnit 5 i l'anotació @Test(expected)
en JUnit 4. També hem treballat amb exemples pràctics i exercicis per reforçar els conceptes apresos. Ara estem preparats per gestionar i verificar excepcions en els nostres tests de manera efectiva.
Curs de JUnit
Mòdul 1: Introducció a JUnit
Mòdul 2: Anotacions Bàsiques de JUnit
- Entenent @Test
- Utilitzant @Before i @After
- Utilitzant @BeforeClass i @AfterClass
- Ignorant Tests amb @Ignore
Mòdul 3: Assertions a JUnit
Mòdul 4: Tests Parametritzats
- Introducció als Tests Parametritzats
- Creant Tests Parametritzats
- Utilitzant @ParameterizedTest
- Tests Parametritzats Personalitzats
Mòdul 5: Suites de Test
Mòdul 6: Mocking amb JUnit
Mòdul 7: Funcions Avançades de JUnit
Mòdul 8: Millors Pràctiques i Consells
- Escrivint Tests Efectius
- Organitzant el Codi de Test
- Desenvolupament Guiat per Tests (TDD)
- Integració Contínua amb JUnit