🔌 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 (H2 ou SQLite) para rodar os testes de integração de forma rápida e segura, sem depender do banco de dados oficial de Desenvolvimento. 🚀


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