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

  1. Exercici 1: Escriu un test que verifiqui que una excepció NullPointerException és llançada quan es passa un valor null a un mètode que no accepta valors nuls.

  2. 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.

© Copyright 2024. Tots els drets reservats