🔌 3.14 Testes de Integração: Além do Isolamento
Até agora, focamos em Testes de Unidade puristas: isolamos a lógica de negócio das suas dependências externas usando Mock Objects. No entanto, Mocks são “mentirosos” por um bom motivo: eles simulam o comportamento, mas não executam a lógica real do outro sistema (como o Banco de Dados).
A pergunta que fica é: como garantir que as nossas consultas SQL, comandos HQL ou configurações de Framework (Hibernate/JPA) estão realmente corretos? É aqui que entram os Testes de Integração.
🏗️ O Cenário: Acesso a Dados (DAO)
Um DAO (Data Access Object) é uma ponte entre o Java e o Banco de Dados. Observe este UsuarioDao que utiliza o Hibernate para persistência:
📄 src/main/java/…/repositorio/UsuarioDao.java
public class UsuarioDao {
private final Session session;
public UsuarioDao(Session session) {
this.session = session;
}
public Usuario porId(int id) {
return (Usuario) session.load(Usuario.class, id);
}
public Usuario porNomeEEmail(String nome, String email) {
return (Usuario) session.createQuery(
"from Usuario u where u.nome = :nome and u.email = :email")
.setParameter("nome", nome)
.setParameter("email", email)
.uniqueResult();
}
public void salvar(Usuario usuario) {
session.save(usuario);
}
}🏗️ Por que não usar Mocks para o DAO?
Se você tentar Mockar a classe UsuarioDao em um teste de unidade para outra classe, você estará apenas assumindo que a query "from Usuario u where u.nome = :nome..." está correta. Mas e se você cometeu um erro de sintaxe no HQL? O Mock passará alegremente, e o bug só estourará em Produção.
📊 A Ponte de Integração
O teste de integração valida se o “cano” está conectado corretamente em ambas as pontas.
flowchart LR A["Teste Integração"] --> B["UsuarioDao.java"] B -- "Query HQL" --> C["Hibernate Framework"] C -- "SQL Nativo" --> D["Banco de Dados (SQLite/H2)"] D -- "Result Set" --> C C -- "Mapeamento" --> B B -- "Entidade" --> A style D fill:#f1f8e9,stroke:#558b2f,stroke-width:2px
O Valor do Teste de Integração 🛡️
Diferente do teste de unidade, o teste de integração conversa com o banco de dados real (ou uma versão de testes dele). O objetivo é garantir que a persistência, as constraints e as queries complexas funcionem exatamente como o esperado. 🏁
Dica de Ouro ⚡
Nos próximos capítulos, veremos como configurar um banco de dados leve (
H2ouSQLite) para rodar os testes de integração de forma rápida e segura, sem depender do banco de dados oficial de Desenvolvimento. 🚀