📊 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:

  1. Data de abertura dentro do intervalo informado.
  2. 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 @Before para dar um TRUNCATE ou DELETE nas tabelas, ou prefira o uso de Transactions com @Rollback automá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). 🚀


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