🔄 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ção | Momento da Execução | Frequência |
|---|---|---|
@BeforeAll | Antes do primeiro teste da classe | 1 vez |
@AfterAll | Após o último teste da classe | 1 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
@BeforeAllgeralmente indica que você está entrando no território de Testes de Integração. Mantenha o isolamento: se um teste modificar o estado global, use@AfterEachpara resetá-lo e não comprometer os testes seguintes. ⚡
A Regra do Encerramento 🏁
Sempre utilize
@AfterEachou@AfterAllpara fechar recursos. Conexões pendentes podem causar “vazamentos” (leaks) que derrubam o build em ambientes de CI/CD. 🚀