Para que o teste solicitado passe, foi necessário alterar o código disponibilizado. Seguem as alterações:
Classe LeilaoBuilder:
adicionado campo lances:
... private Calendar dataAbertura; private boolean encerrado; ---> private List<Lance> lances; ...
inicializado campo lances no construtor:
... this.lances = new ArrayList<>();
adicionado método comLance(Lance lance):
public LeilaoBuilder comLance(Lance lance) { lances.add(lance); return this; }
alterado método constroi, que fica como segue:
public Leilao constroi() { Leilao leilao = new Leilao(nome, valor, dono, usado); leilao.setDataAbertura(dataAbertura); --> lances.forEach(leilao::adicionaLance); if(encerrado) leilao.encerra(); return leilao; }
Classe LeilaoDao:
- alterado método disputadosEntre, adicionando sinal de igual na linha que compara o tamanho da lista de lances:
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(); }
Classe Lance:
- retirado campo leilao do construtor:
public Lance(Calendar data, Usuario usuario, double valor) { this.usuario = usuario; this.data = data; this.valor = valor; }
Esse é o teste:
@Test public void deveRetornarLeiloesDisputadosNoPeriodo(){
Usuario dono = new Usuario("Jose da Silva", "jose@dasilva.com.br");
Usuario comprador1 = new Usuario("Joao", "joao@joao.com.br");
Usuario comprador2 = new Usuario("Maria", "maria@maria.com.br");
Leilao leilao1 = new LeilaoBuilder().comNome("Geladeira").comValor(1500.0).comDono(dono).diasAtras(2)
.comLance(new Lance(Calendar.getInstance(),comprador1,2000.0)).encerrado().constroi();
Leilao leilao2 = new LeilaoBuilder().comNome("Nintendo Wii").comValor(2500.0).comDono(dono).diasAtras(6)
.comLance(new Lance(Calendar.getInstance(),comprador1,3000.0))
.comLance(new Lance(Calendar.getInstance(),comprador2,3500.0))
.comLance(new Lance(Calendar.getInstance(),comprador1,4000.0))
.constroi();
Leilao leilao3 = new LeilaoBuilder().comNome("Xbox").comValor(3000.0).comDono(dono).diasAtras(12)
.comLance(new Lance(Calendar.getInstance(),comprador1,4000.0)).usado().constroi();
usuarioDao.salvar(dono);
usuarioDao.salvar(comprador1);
usuarioDao.salvar(comprador2);
leilaoDao.salvar(leilao1);
leilaoDao.salvar(leilao2);
leilaoDao.salvar(leilao3);
List<Leilao> leiloes = leilaoDao.disputadosEntre(1000.0, 3000.0);
assertEquals(1, leiloes.size());
assertEquals("Nintendo Wii", leiloes.get(0).getNome());
}