🔌 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. 🚀