En aquest tema, aprendrem sobre les anotacions @BeforeClass i @AfterClass a JUnit. Aquestes anotacions són útils per configurar i netejar recursos que són compartits per tots els tests d'una classe de test. A diferència de @Before i @After, que s'executen abans i després de cada test, @BeforeClass i @AfterClass s'executen una sola vegada abans i després de tots els tests de la classe, respectivament.

Conceptes Clau

  • @BeforeClass: S'utilitza per executar codi abans de qualsevol test en la classe de test. Ideal per inicialitzar recursos compartits.
  • @AfterClass: S'utilitza per executar codi després de tots els tests en la classe de test. Ideal per alliberar recursos compartits.

Exemple Pràctic

A continuació, veurem un exemple pràctic per entendre millor com utilitzar aquestes anotacions.

Exemple de Codi

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculadoraTest {

    private static Calculadora calculadora;

    @BeforeClass
    public static void inicialitzar() {
        // Aquest mètode s'executa una sola vegada abans de tots els tests
        calculadora = new Calculadora();
        System.out.println("Inicialitzant recursos compartits...");
    }

    @AfterClass
    public static void netejar() {
        // Aquest mètode s'executa una sola vegada després de tots els tests
        calculadora = null;
        System.out.println("Alliberant recursos compartits...");
    }

    @Test
    public void testSuma() {
        int resultat = calculadora.suma(2, 3);
        assertEquals(5, resultat);
    }

    @Test
    public void testResta() {
        int resultat = calculadora.resta(5, 3);
        assertEquals(2, resultat);
    }
}

Explicació del Codi

  1. Inicialització amb @BeforeClass:

    • El mètode inicialitzar() està anotat amb @BeforeClass, el que significa que s'executarà una sola vegada abans de qualsevol test en la classe CalculadoraTest.
    • En aquest mètode, inicialitzem una instància de Calculadora que serà compartida per tots els tests.
  2. Neteja amb @AfterClass:

    • El mètode netejar() està anotat amb @AfterClass, el que significa que s'executarà una sola vegada després de tots els tests en la classe CalculadoraTest.
    • En aquest mètode, alliberem la instància de Calculadora establint-la a null.
  3. Tests Individuals:

    • Els mètodes testSuma() i testResta() són tests individuals que utilitzen la instància compartida de Calculadora per realitzar operacions i verificar els resultats amb assertions.

Exercici Pràctic

Exercici

Crea una classe de test per a una classe BaseDeDades que necessiti una connexió a la base de dades abans de qualsevol test i que tanqui la connexió després de tots els tests.

  1. Defineix una classe BaseDeDadesTest.
  2. Utilitza @BeforeClass per establir una connexió a la base de dades.
  3. Utilitza @AfterClass per tancar la connexió a la base de dades.
  4. Escriu almenys dos tests que utilitzin la connexió a la base de dades.

Solució

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class BaseDeDadesTest {

    private static BaseDeDades baseDeDades;

    @BeforeClass
    public static void establirConnexio() {
        // Aquest mètode s'executa una sola vegada abans de tots els tests
        baseDeDades = new BaseDeDades();
        baseDeDades.connectar();
        System.out.println("Connexió a la base de dades establerta...");
    }

    @AfterClass
    public static void tancarConnexio() {
        // Aquest mètode s'executa una sola vegada després de tots els tests
        baseDeDades.desconnectar();
        baseDeDades = null;
        System.out.println("Connexió a la base de dades tancada...");
    }

    @Test
    public void testConnexioNoNull() {
        assertNotNull(baseDeDades.getConnexio());
    }

    @Test
    public void testConsulta() {
        boolean resultat = baseDeDades.executarConsulta("SELECT * FROM usuaris");
        assertTrue(resultat);
    }
}

Explicació de la Solució

  1. Inicialització amb @BeforeClass:

    • El mètode establirConnexio() s'executa abans de qualsevol test per establir una connexió a la base de dades.
  2. Neteja amb @AfterClass:

    • El mètode tancarConnexio() s'executa després de tots els tests per tancar la connexió a la base de dades.
  3. Tests Individuals:

    • testConnexioNoNull() verifica que la connexió a la base de dades no sigui null.
    • testConsulta() verifica que una consulta SQL s'executi correctament.

Resum

En aquesta secció, hem après com utilitzar les anotacions @BeforeClass i @AfterClass per inicialitzar i netejar recursos compartits abans i després de tots els tests d'una classe. Aquestes anotacions són especialment útils per gestionar recursos costosos com connexions a bases de dades, fitxers, o altres serveis externs.

© Copyright 2024. Tots els drets reservats