🧼 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
@Afterpara 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. 🚀