🧼 4.6 Organizando Testes de Integração com JUnit

Conforme nossa bateria de testes de integração cresce, começamos a notar a repetição de padrões: a abertura e o fechamento da Session do Hibernate ocorrem em todos os métodos de teste. Repetir esse código de infraestrutura polui os testes e dificulta a manutenção. Para resolver isso, utilizamos os ganchos do JUnit: @Before e @After.

🏁 O Padrão DRY (Don’t Repeat Yourself)

Métodos anotados com @Before rodam antes de cada teste da classe, enquanto os anotados com @After rodam depois. Isso nos permite isolar a criação do DAO e da conexão em um único lugar.

📄 src/test/java/…/repositorio/UsuarioDaoTest.java (Refatorado)

public class UsuarioDaoTest {
 
    private Session session;
 
    private UsuarioDao usuarioDao;
 
    @Before
 
    public void setup() {
 
    // Criamos a infraestrutura necessária antes de cada teste 🏗️

    this.session = new CriadorDeSessao().getSession();

    this.usuarioDao = new UsuarioDao(session);

}

@After
    public void teardown() {
 
    // Fechamos os recursos no final para evitar vazamento de memória 🚿

    this.session.close();

}

@Test
    public void deveEncontrarUsuarioPorNomeEEmail() {
 
        Usuario novoUsuario = new Usuario("Joao da Silva", "joao@dasilva.com.br");
 
        usuarioDao.salvar(novoUsuario);
 
        Usuario usuarioNoBanco = usuarioDao.porNomeEEmail("Joao da Silva", "joao@dasilva.com.br");
 
        assertEquals("Joao da Silva", usuarioNoBanco.getNome());
 
        assertEquals("joao@dasilva.com.br", usuarioNoBanco.getEmail());
 
    }
 
    @Test
 
    public void deveRetornarNuloSeNaoEncontrarUsuario() {
 
        Usuario usuarioNoBanco = usuarioDao.porNomeEEmail("Joao Joaquim", "joao@joaquim.com.br");
 
        assertNull(usuarioNoBanco);
 
    }
 
}

📊 Fluxo de Vida dos Testes de Integração

graph TD
    A["🏁 Início Batteria"] --> B["Setup (@Before) 🏗️"]
    B --> C["Teste 1 (Lógica)"]
    C --> D["Teardown (@After) 🚿"]
    D --> E["Setup (@Before) 🏗️"]
    E --> F["Teste 2 (Lógica)"]
    F --> G["Teardown (@After) 🚿"]
    G --> H["🏁 Fim"]
    style B fill:#e3f2fd,stroke:#1e88e5
    style D fill:#fdf2f2,stroke:#c0392b

Clean Code em Testes 🛡️

Lembre-se: o código de teste deve ser tratado com o mesmo carinho que o código de produção. A legibilidade é vital. Ao centralizar a abertura e fechamento da sessão, o foco do desenvolvedor permanece na lógica de integração que está sendo testada. 🏁


Dica de Ouro ⚡

Usar @After para fechar a sessão garante que, mesmo que o teste falhe (Exception), a conexão com o banco de dados será liberada, evitando travar o servidor durante execuções massivas. 🚀


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