🕵️ 4.1 O Perigo de Mockar o que não se Domina

Será que faz sentido testar nosso DAO e “Mockar o banco de dados”? Vamos analisar o custo e o benefício de simular a Session do Hibernate para testar o método porNomeEEmail().

🏁 O Problema de Mockar a Infraestrutura

Ao Mockar um DAO, precisamos simular toda a “conversa” entre o Java e o Framework de persistência. Isso envolve Mockar a Session, a Query e todos os encadeamentos de métodos (setParameter, uniqueResult, etc.).

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

@Test
 
public void deveEncontrarPeloNomeEEmailMockado() {
 
    // Setup exaustivo de Mocks
 
    Session session = mock(Session.class);
 
    Query query = mock(Query.class);
 
    UsuarioDao usuarioDao = new UsuarioDao(session);
 
    Usuario usuario = new Usuario("Joao da Silva", "joao@dasilva.com.br");
 
    // Tentando simular o comportamento do Hibernate
 
    String hql = "from Usuario u where u.nome = :nome and x.email = :email";
 
    when(session.createQuery(hql)).thenReturn(query);
 
    when(query.uniqueResult()).thenReturn(usuario);
 
    when(query.setParameter("nome", "Joao da Silva")).thenReturn(query);
 
    when(query.setParameter("email", "joao@dasilva.com.br")).thenReturn(query);
 
    // Execução
 
    Usuario usuarioDoBanco = usuarioDao.porNomeEEmail("Joao da Silva", "joao@dasilva.com.br");
 
    // Validação
 
    assertEquals(usuario.getNome(), usuarioDoBanco.getNome());
 
    assertEquals(usuario.getEmail(), usuarioDoBanco.getEmail());
 
}

📊 O Veredito: O Teste que “Mente” para Você

O teste acima passará com sucesso (Verde! ✅). Mas olhe a consulta HQL novamente: "from Usuario u where u.nome = :nome and x.email = :email"

O Bug Silencioso ⚡

Há um erro grave: escrevemos x.email em vez de u.email. Como estamos Mockando o Hibernate, o framework nunca executa a query real, e o erro passa despercebido. Se usássemos um banco de dados real, a query falharia imediatamente com um QuerySyntaxException.


📈 Comparativo de Fidelidade

graph TD
    A["Teste de Unidade (Mock)"] --> B["Rápido"]
    A --> C["Falsa Segurança (Esconde bugs SQL)"]
    D["Teste de Integração (DB Real)"] --> E["Lento (Relativamente)"]
    D --> F["Fiel (Pega bugs de Sintaxe e Schema) ✨"]
    style F fill:#f1f8e9,stroke:#558b2f,stroke-width:2px

Regra de Ouro 🛡️

Não Mocke o que você não possui. Você não é o autor do Hibernate ou do MySQL; você não conhece todas as nuances de como eles reagem a uma query mal formada. Teste DAOs sempre com bancos de dados reais (mesmo que em memória como H2 ou SQLite). 🏁


Próximo Passo ⚡

No capítulo seguinte, aprenderemos a configurar o SQLite para realizar estes testes de integração de forma rápida e segura, mantendo o feedback constante sem abdicar da fidelidade técnica. 🚀


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