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 valornulla 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
