🕵️ 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.emailem vez deu.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 umQuerySyntaxException.
📈 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. 🚀