3
respostas

Teste não cobrindo cenários

A resposta do instrutor para esse caso não cobre cenários onde o leilão foi encerrado, limites mínimos e máximos do valor mínimo (incluindo e excluindo registros). Da maneira que está já estaria ok o teste?

Fiz um teste tentando incluir as variações da query.

    @Test
    public void deveTrazerLeiloesNaoEncerradosComNoMinimoTresLancesEDentroDeUmIntervaloValoresMinimo() {
        Leilao leilao1 = LeilaoDataBuilder.builder().tendoComo(vendedor).iniciandoEm(1600).encerrado()
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();
        Leilao leilao2 = LeilaoDataBuilder.builder().iniciandoEm(1149).tendoComo(vendedor)
                .comLanceDe(lucia, 1150)
                .comLanceDe(mario, 1251)
                .comLanceDe(lucia, 1350)
                .comLanceDe(mario, 1350)
                .construir();
        Leilao leilao3 = LeilaoDataBuilder.builder().iniciandoEm(1600).tendoComo(vendedor)
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();
        Leilao leilao4 = LeilaoDataBuilder.builder().iniciandoEm(1149).tendoComo(vendedor)
                .comLanceDe(lucia, 1150)
                .comLanceDe(mario, 1251)
                .comLanceDe(lucia, 1251)
                .construir();
        Leilao leilao5 = LeilaoDataBuilder.builder().iniciandoEm(1601).tendoComo(vendedor)
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();
        Leilao leilao6 = LeilaoDataBuilder.builder().iniciandoEm(1148).tendoComo(vendedor)
                .comLanceDe(lucia, 1601)
                .comLanceDe(mario, 1650)
                .comLanceDe(lucia, 1750)
                .comLanceDe(mario, 1850)
                .construir();

        session.save(leilao1);
        session.save(leilao2);
        session.save(leilao3);
        session.save(leilao4);
        session.save(leilao5);
        session.save(leilao6);

        List<Leilao> leiloesNaoEncerradosPorPeriodo = leilaoDao.disputadosEntre(1149, 1600);

        assertThat(leiloesNaoEncerradosPorPeriodo, allOf(hasItem(leilao2), hasItem(leilao3)));
        assertThat(leiloesNaoEncerradosPorPeriodo, hasSize(2));
    }
3 respostas

Oi Felipe, tudo certo? =)

O teste está sempre baseado na regra de negocio. Já que o método disputadosEntre seleciona apenas os que não foram encerrados e com 3 lances ou mais o teste cobre exatamente o que precisava cobrir.

Caso houvesse alguma mudança na regra de negocio, como, por exemplo, uma validação para verificar se o inicio é menor que o fim. Ai sim teriamos a necessidade de outro teste para cobrir essa nova regra de negocio do método.

Espero ter ajudado =)

Abraço.

Então mais aí volto a a perguntar. Olhando a query abaixo o encerrado por exemplo não é testado, assim como o between com valores dentro e fora do mesmo. Não deveriam ser testados?

public List<Leilao> disputadosEntre(double inicio, double fim) {
        return session.createQuery("from Leilao l where l.valorInicial " +
                "between :inicio and :fim and l.encerrado = false " +
                "and size(l.lances) > 3")
                .setParameter("inicio", inicio)
                .setParameter("fim", fim)
                .list();
    }

Poderia até ser testado. Mas, nesse caso, a gente estaria testando o mysql, não a lógica do método disputadosEntre que é retornar os leilões não encerrados entre o inicio e fim.