En aquest tema, explorarem les assertions avançades a JUnit, que ens permeten verificar condicions més complexes en els nostres tests. Les assertions avançades són essencials per assegurar que el nostre codi es comporta correctament en situacions més sofisticades.

Continguts

Assertions amb Missatges Personalitzats

Les assertions amb missatges personalitzats ens permeten proporcionar informació addicional quan una assertion falla, facilitant la depuració.

Exemple:

import static org.junit.jupiter.api.Assertions.assertEquals;

public class AdvancedAssertionsTest {

    @Test
    void testWithCustomMessage() {
        int expected = 42;
        int actual = 40 + 2;
        assertEquals(expected, actual, "El valor esperat no coincideix amb el valor actual");
    }
}

En aquest exemple, si l'assertion falla, el missatge "El valor esperat no coincideix amb el valor actual" es mostrarà a la sortida del test.

Assertions per Arrays i Col·leccions

JUnit proporciona assertions específiques per comparar arrays i col·leccions, assegurant que els elements i l'ordre siguin correctes.

Exemple:

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertIterableEquals;

import java.util.Arrays;
import java.util.List;

public class AdvancedAssertionsTest {

    @Test
    void testArrayEquals() {
        int[] expected = {1, 2, 3};
        int[] actual = {1, 2, 3};
        assertArrayEquals(expected, actual, "Els arrays no són iguals");
    }

    @Test
    void testIterableEquals() {
        List<String> expected = Arrays.asList("a", "b", "c");
        List<String> actual = Arrays.asList("a", "b", "c");
        assertIterableEquals(expected, actual, "Les col·leccions no són iguals");
    }
}

Aquestes assertions asseguren que els arrays i les col·leccions continguin els mateixos elements en el mateix ordre.

Assertions per Excepcions

JUnit permet verificar que una excepció específica es llança durant l'execució d'un bloc de codi.

Exemple:

import static org.junit.jupiter.api.Assertions.assertThrows;

public class AdvancedAssertionsTest {

    @Test
    void testExceptionThrowing() {
        Exception exception = assertThrows(IllegalArgumentException.class, () -> {
            throw new IllegalArgumentException("Argument no vàlid");
        });
        assertEquals("Argument no vàlid", exception.getMessage());
    }
}

En aquest exemple, verifiquem que es llança una IllegalArgumentException amb el missatge esperat.

Assertions per Temps d'Execució

Podem utilitzar assertions per assegurar que un bloc de codi s'executa dins d'un temps determinat.

Exemple:

import static org.junit.jupiter.api.Assertions.assertTimeout;

import java.time.Duration;

public class AdvancedAssertionsTest {

    @Test
    void testTimeout() {
        assertTimeout(Duration.ofSeconds(2), () -> {
            // Codi que ha de completar-se en menys de 2 segons
            Thread.sleep(1000);
        });
    }
}

Aquest test fallarà si el bloc de codi triga més de 2 segons a executar-se.

Assertions per Condicions Complexes

Podem combinar diverses assertions per verificar condicions més complexes.

Exemple:

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;

public class AdvancedAssertionsTest {

    @Test
    void testComplexConditions() {
        int value = 5;
        assertAll("Comprovacions múltiples",
            () -> assertTrue(value > 0, "El valor ha de ser positiu"),
            () -> assertFalse(value < 0, "El valor no ha de ser negatiu"),
            () -> assertTrue(value < 10, "El valor ha de ser menor que 10")
        );
    }
}

Aquest exemple utilitza assertAll per agrupar diverses assertions en un sol test.

Exercicis Pràctics

Exercici 1:

Escriu un test que verifiqui que una llista de noms conté exactament els elements esperats en l'ordre correcte.

Solució:

import static org.junit.jupiter.api.Assertions.assertIterableEquals;

import java.util.Arrays;
import java.util.List;

public class AdvancedAssertionsTest {

    @Test
    void testListContents() {
        List<String> expected = Arrays.asList("Anna", "Bernat", "Carla");
        List<String> actual = Arrays.asList("Anna", "Bernat", "Carla");
        assertIterableEquals(expected, actual, "Les llistes no coincideixen");
    }
}

Exercici 2:

Escriu un test que verifiqui que una excepció NullPointerException es llança quan es passa un valor nul a un mètode.

Solució:

import static org.junit.jupiter.api.Assertions.assertThrows;

public class AdvancedAssertionsTest {

    @Test
    void testNullPointerException() {
        assertThrows(NullPointerException.class, () -> {
            String str = null;
            str.length();
        });
    }
}

Conclusió

Les assertions avançades a JUnit ens permeten escriure tests més robustos i detallats, assegurant que el nostre codi es comporta correctament en una varietat de situacions. Amb aquestes eines, podem verificar condicions complexes, gestionar excepcions i assegurar-nos que el nostre codi compleix amb els requisits de rendiment.

© Copyright 2024. Tots els drets reservats