Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Teste não passa no exercício "Testando consulta com dependências"

Estava fazendo o exercício que pedia que usasse o método disputadosEntre(Calendar inicio, Calendar fim) e, além de ter uma discrepância com o método disponibilizado no projeto do curso (onde os parâmetros do método disputadosEntre está como double inicio e double fim), ao consultar a resposta do exercício e aplicar no meu projeto, o teste não passa, dizendo que o esperado era de 1 mas o resultado foi de 0.

Como não consegui achar o erro que cometi, decidi fazer a pergunta. Agradeço desde já.

O método disputadosEntre é dessa classe:

public class LeilaoDao {

    private final Session session;

    public LeilaoDao(Session session) {
        this.session = session;
    }

    public void salvar(Leilao leilao) {
        session.save(leilao);

        for(Lance lance : leilao.getLances()) {
            session.save(lance);
        }
    }

    public Leilao porId(int id) {
        return (Leilao) session.get(Leilao.class, id);
    }

    @SuppressWarnings("unchecked")
    public List<Leilao> novos() {
        return session.createQuery("from Leilao l where usado = false")
                .list();
    }

    @SuppressWarnings("unchecked")
    public List<Leilao> antigos() {
        Calendar seteDiasAtras = Calendar.getInstance();
        seteDiasAtras.add(Calendar.DAY_OF_MONTH, -7);

        return session.createQuery("from Leilao l where dataAbertura < :data")
                .setParameter("data", seteDiasAtras)
                .list();
    }

    @SuppressWarnings("unchecked")
    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();
    }

    @SuppressWarnings("unchecked")
    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();
    }

    public Long total() {
        return (Long) session.createQuery("select count(l) from Leilao l where l.encerrado = false")
                .uniqueResult();
    }

    public void atualiza(Leilao leilao) {
        session.merge(leilao);
    }

    public void deleta(Leilao leilao) {
        session.delete(leilao);
    }

    public void deletaEncerrados() {
        session
            .createQuery("delete from Leilao l where l.encerrado = true")
            .executeUpdate();
    }

    @SuppressWarnings("unchecked")
    public List<Leilao> listaLeiloesDoUsuario(Usuario usuario) {
        return session.createQuery("select lance.leilao " +
                                   "from Lance lance " +
                                   "where lance.usuario = :usuario")
                .setParameter("usuario", usuario).list();
    }

    public double getValorInicialMedioDoUsuario(Usuario usuario) {
        return (Double) session.createQuery("select avg(lance.leilao.valorInicial) " +
                                            "from Lance lance " +
                                            "where lance.usuario = :usuario")
                    .setParameter("usuario", usuario)
                    .uniqueResult();
    }
}

E o teste dado no exercício é este:

@Test
    public void deveRetornarLeiloesDisputados() {
        Usuario mauricio = new Usuario("Mauricio", "mauricio@aniche.com.br");
        Usuario marcelo = new Usuario("Marcelo", "marcelo@aniche.com.br");

        Leilao leilao1 = new LeilaoBuilder()
                .comDono(marcelo)
                .comValor(3000.0)
                .comLance(Calendar.getInstance(), mauricio, 3000.0)
                .comLance(Calendar.getInstance(), marcelo, 3100.0)
                .constroi();

        Leilao leilao2 = new LeilaoBuilder()
                .comDono(mauricio)
                .comValor(3200.0)
                .comLance(Calendar.getInstance(), mauricio, 3000.0)
                .comLance(Calendar.getInstance(), marcelo, 3100.0)
                .comLance(Calendar.getInstance(), mauricio, 3200.0)
                .comLance(Calendar.getInstance(), marcelo, 3300.0)
                .comLance(Calendar.getInstance(), mauricio, 3400.0)
                .comLance(Calendar.getInstance(), marcelo, 3500.0)
                .constroi();

        usuarioDao.salvar(marcelo);
        usuarioDao.salvar(mauricio);
        leilaoDao.salvar(leilao1);
        leilaoDao.salvar(leilao2);

        List<Leilao> leiloes = leilaoDao.disputadosEntre(2500, 3500);

        assertEquals(1, leiloes.size());
        assertEquals(3200.0, leiloes.get(0).getValorInicial(), 0.00001);
    }
1 resposta
solução!

Fala Guilherme, beleza?

No meu caso faltava um método no LeilaoBuilder:

 public LeilaoBuilder comLance(Calendar calendar, Usuario usuario, double valor) {
        this.lances.add(new Lance(calendar, usuario, valor, null));
        return this;
    }

E também no LeilaoBuilder o método constroi ficou da seguinte forma:

 public Leilao constroi() {
        Leilao leilao = new Leilao(nome, valor, dono, usado);
        leilao.setDataAbertura(dataAbertura);

        for (Lance lance : this.lances) {
            leilao.adicionaLance(lance);
        }

        if(encerrado) leilao.encerra();

        return leilao;
    }

Dessa forma o teste passou.