🔄 1.16 Ciclo de Vida do JUnit 5: After e Hooks Globais

Além do @BeforeEach, o JUnit 5 oferece hooks de controle para gerenciar recursos externos (DBs, Sockets, Arquivos). Dominar este ciclo garante que seus testes sejam isolados e que o ambiente seja devidamente limpo após o uso.

🏗️ Teardown de Instância: @AfterEach

O @AfterEach é o espelho do @BeforeEach. Ele é executado após cada teste, garantindo a limpeza do cenário, independente do resultado (sucesso ou falha).

@AfterEach
void tearDown() {
    // Exemplo: Fechamento de recursos ou limpeza de arquivos temporários
    servico.shutdown();
}

⚡ Hooks Globais: @BeforeAll e @AfterAll

Para recursos caros (ex: subir um Testcontainer de Banco de Dados ou um Servidor HTTP Mock), utilizamos hooks de classe. Por padrão, estes métodos devem ser estáticos.

AnotaçãoMomento da ExecuçãoFrequência
@BeforeAllAntes do primeiro teste da classe1 vez
@AfterAllApós o último teste da classe1 vez

📄 Exemplo de Configuração de Infraestrutura

class IntegracaoTest {
 
    @BeforeAll
    static void inicializaInfra() {
        System.out.println("--- Subindo Container de Banco de Dados ---");
    }
 
    @AfterAll
    static void finalizaInfra() {
        System.out.println("--- Encerrando Container ---");
    }
}

📊 Ciclo de Vida Federado (Jupiter)

stateDiagram-v2
    [*] --> BeforeAll
    BeforeAll --> BeforeEach
    BeforeEach --> Test_1
    Test_1 --> AfterEach
    AfterEach --> BeforeEach
    BeforeEach --> Test_n
    Test_n --> AfterEach
    AfterEach --> AfterAll
    AfterAll --> [*]
    state BeforeAll <<static>>
    state AfterAll <<static>>

Testes de Unidade vs Integração 🛡️

O uso de @BeforeAll geralmente indica que você está entrando no território de Testes de Integração. Mantenha o isolamento: se um teste modificar o estado global, use @AfterEach para resetá-lo e não comprometer os testes seguintes. ⚡


A Regra do Encerramento 🏁

Sempre utilize @AfterEach ou @AfterAll para fechar recursos. Conexões pendentes podem causar “vazamentos” (leaks) que derrubam o build em ambientes de CI/CD. 🚀


⬅️ Capítulo Anterior | Próximo Capítulo ➡️