🔌 4.2 Testando DAOs: A Realidade do Banco de Dados

Se o único objetivo de um DAO é intermediar a comunicação com o banco de dados, não faz sentido simular justamente o serviço com o qual ele se comunica. Para garantir que nossos INSERTs, SELECTs e UPDATEs estão semanticamente corretos, precisamos de um Teste de Integração.

🏗️ O Ciclo de Vida do Teste de Integração

Diferente de um teste de unidade, aqui precisamos garantir que o cenário exista fisicamente no banco de dados antes de dispararmos a ação de teste.

📄 src/test/java/…/repositorio/UsuarioDaoTest.java (A Abordagem Real)

@Test
 
public void deveEncontrarUsuarioPorNomeEEmail() {
 
    // 1. Iniciando a Infraestrutura Real
 
    Session session = new CriadorDeSessao().getSession();
 
    UsuarioDao usuarioDao = new UsuarioDao(session);
 
    // 2. Montando o Cenário (Persistindo o dado de teste)
 
    Usuario novoUsuario = new Usuario("Joao da Silva", "joao@dasilva.com.br");
 
    usuarioDao.salvar(novoUsuario);
 
    // 3. Executando a Ação (Buscando do Banco)
 
    Usuario usuarioDoBanco = usuarioDao.porNomeEEmail("Joao da Silva", "joao@dasilva.com.br");
 
    // 4. Validação
 
    assertEquals("Joao da Silva", usuarioDoBanco.getNome());
 
    assertEquals("joao@dasilva.com.br", usuarioDoBanco.getEmail());
 
    // 5. Cleanup: Fechando a conexão
 
    session.close();
 
}

📊 Por que este teste é superior ao Mock?

Diferente do teste anterior, este teste obriga o Hibernate a compilar o HQL e enviá-lo ao banco. Se houver um erro de digitação como x.email em vez de u.email, o banco rejeitará a query e o teste ficará vermelho (Falha), indicando exatamente onde está o problema.

sequenceDiagram
    participant T as Teste Integração
    participant DAO as UsuarioDao
    participant DB as Banco de Dados
    
    T->>DAO: salvar(novoUsuario)
    DAO->>DB: INSERT into Usuarios...
    T->>DAO: porNomeEEmail(...)
    DAO->>DB: SELECT * FROM Usuarios WHERE...
    DB-->>DAO: ResultSet
    DAO-->>T: Objeto Usuario
    Note over T, DB: Valida se o Objeto veio do Banco corretamente

Persistência Manual 🛡️

Note que tivemos que chamar usuarioDao.salvar(novoUsuario) antes de buscar. Em testes de integração, você é responsável por colocar o banco de dados no estado esperado para que a consulta tenha o que retornar. 🏁


Dica de Ouro ⚡

Testes de integração costumam ser mais lentos que testes de unidade. Por isso, foque neles para validar queries complexas e regras de persistência. Deixe a lógica pura de negócio para os testes de unidade com Mocks. 🚀


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