📊 4.4 Praticando com Consultas Complexas
Algumas consultas são intrinsecamente mais difíceis de serem testadas devido à complexidade dos seus cenários e à sensibilidade dos dados. Nesses casos, a clareza na montagem do cenário (Setup) é o segredo para um teste de integração confiável.
🏁 O Cenário: Busca por Período
Considere o método porPeriodo(Calendar inicio, Calendar fim) da nossa classe LeilaoDao. Ele deve retornar leilões que satisfyçam duas condições:
- Data de abertura dentro do intervalo informado.
- Leilão ainda não encerrado.
📄 src/main/java/…/repositorio/LeilaoDao.java
public List<Leilao> porPeriodo(Calendar inicio, Calendar fim) {
return session.createQuery("from Leilao l where l.dataAbertura between :inicio and :fim and l.encerrado = false")
.setParameter("inicio", inicio)
.setParameter("fim", fim)
.list();
}🧪 Estratégias de Cobertura
Para testar este método com exatidão, precisamos validar os limites do intervalo:
📄 src/test/java/…/repositorio/LeilaoDaoTest.java
@Test
public void deveTrazerLeiloesNaoEncerradosNoPeriodo() {
// 1. Definindo Datas (Boundary testing)
Calendar comecoDoIntervalo = Calendar.getInstance();
comecoDoIntervalo.add(Calendar.DAY_OF_MONTH, -10);
Calendar fimDoIntervalo = Calendar.getInstance();
Calendar dataDentro = Calendar.getInstance();
dataDentro.add(Calendar.DAY_OF_MONTH, -2);
Calendar dataFora = Calendar.getInstance();
dataFora.add(Calendar.DAY_OF_MONTH, -20);
Usuario mauricio = new Usuario("Maurício", "mauricio@aniche.com.br");
// 2. Montagem do Cenário
Leilao leilao1 = new Leilao("XBox", 700.0, mauricio, false);
leilao1.setDataAbertura(dataDentro);
Leilao leilao2 = new Leilao("Geladeira", 1700.0, mauricio, false);
leilao2.setDataAbertura(dataFora);
// 3. Persistência e Execução
usuarioDao.salvar(mauricio);
leilaoDao.salvar(leilao1);
leilaoDao.salvar(leilao2);
List<Leilao> leiloes = leilaoDao.porPeriodo(comecoDoIntervalo, fimDoIntervalo);
// 4. Validação
assertEquals(1, leiloes.size());
assertEquals("XBox", leiloes.get(0).getNome());
}📊 Limitações e Fronteiras de Data
flowchart LR A["-20 Dias (Fora)"] --- B["-10 Dias (Início)"] B --- C["-2 Dias (Dentro) ✨"] C --- D["Hoje (Fim)"] D --- E["+1 Dia (Fora)"] style C fill:#f1f8e9,stroke:#558b2f,stroke-width:2px
Limpeza do Ambiente 🛡️
Em testes de integração com banco de dados, é vital garantir que um teste não interfira no outro. Utilize métodos anotados com
@Beforepara dar um TRUNCATE ou DELETE nas tabelas, ou prefira o uso de Transactions com@Rollbackautomático ao final de cada execução.
Dica de Ouro ⚡
Evite usar scripts SQL estáticos para popular o banco em testes. Prefira usar os próprios Data Builders em Java; eles são mais fáceis de manter quando a estrutura da tabela muda (ex: adição de uma nova coluna). 🚀