Vou deixar os meu códigos abaixo:
GeradorDePagamentosTest.java
package br.com.alura.leilao.service;
import static org.junit.jupiter.api.Assertions.*;
import java.math.BigDecimal;
import java.time.Clock;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import br.com.alura.leilao.dao.LeilaoDao;
import br.com.alura.leilao.dao.PagamentoDao;
import br.com.alura.leilao.model.Lance;
import br.com.alura.leilao.model.Leilao;
import br.com.alura.leilao.model.Pagamento;
import br.com.alura.leilao.model.Usuario;
class GeradorDePagamentoTest {
private GeradorDePagamento gerador;
@Mock
private PagamentoDao pagamentoDao;
@Captor
private ArgumentCaptor<Pagamento> captor;
@Mock
private Clock clock;
@BeforeEach
public void beforeEach() {
MockitoAnnotations.initMocks(this);
this.gerador = new GeradorDePagamento(pagamentoDao, clock);
}
@Test
void deveriaCriarPagamentoParaVencedorDoLeilao() {
Leilao leilao = leilao();
Lance vencedor = leilao.getLanceVencedor();
LocalDate data = LocalDate.of(2020, 12, 7);
Instant instant = data.atStartOfDay(ZoneId.systemDefault()).toInstant();
Mockito.when(clock.instant()).thenReturn(instant);
Mockito.when(clock.getZone()).thenReturn(ZoneId.systemDefault());
gerador.gerarPagamento(vencedor);
Mockito.verify(pagamentoDao).salvar(captor.capture());
Pagamento pagamento = captor.getValue();
Assert.assertEquals(LocalDate.now().plusDays(1),
pagamento.getVencimento());
Assert.assertEquals(vencedor.getValor(), pagamento.getValor());
Assert.assertFalse(pagamento.getPago());
Assert.assertEquals(vencedor.getUsuario(), pagamento.getUsuario());
Assert.assertEquals(leilao, pagamento.getLeilao());
}
private Leilao leilao() {
Leilao leilao = new Leilao("Celular",
new BigDecimal("500"),
new Usuario("Fulano"));
Lance lance = new Lance(new Usuario("Ciclano"),
new BigDecimal("900"));
leilao.propoe(lance);
leilao.setLanceVencedor(lance);
return leilao;
}
}
GeradorDePagamento.java
package br.com.alura.leilao.service;
import java.time.Clock;
import java.time.DayOfWeek;
import java.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.alura.leilao.dao.PagamentoDao;
import br.com.alura.leilao.model.Lance;
import br.com.alura.leilao.model.Pagamento;
@Service
public class GeradorDePagamento {
private PagamentoDao pagamentos;
private Clock clock;
@Autowired
public GeradorDePagamento(PagamentoDao pagamentos, Clock clock) {
this.pagamentos = pagamentos;
this.clock = clock;
}
public void gerarPagamento(Lance lanceVencedor) {
LocalDate vencimento = LocalDate.now(clock).plusDays(1);
Pagamento pagamento = new Pagamento(lanceVencedor, proximoDiaUtil(vencimento));
this.pagamentos.salvar(pagamento);
}
private LocalDate proximoDiaUtil(LocalDate dataBase) {
DayOfWeek diaDaSemana = dataBase.getDayOfWeek();
if (diaDaSemana == DayOfWeek.SATURDAY) {
return dataBase.plusDays(2);
} else if (diaDaSemana == DayOfWeek.SUNDAY) {
return dataBase.plusDays(1);
}
return dataBase;
}
}