Oi Tiago,
Existe outra maneira do Mockito passar os mocks para uma classe, sem precisar criar um construtor nela, utilizando a anotação @InjectMocks
:
@ExtendsWith(MockitoExtension.class)
class GeradorDePagamentoTest {
@InjectMocks
private GeradorDePagamento gerador;
@Mock
private PagamentoDao pagamentoDao;
@Captor
private ArgumentCaptor<Pagamento> captor;
@Mock
private Clock 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;
}
}
Desse jeito a classe GeradorDePagamento
não precisa ter um construtor para receber seus objetos compostos, e utilizando o @ExtendWith(MockitoExtension.class)
, em cima da classe de teste, também não precisamos mais inicializar o Mockito e nem o objeto
GeradorDePagamento no método beforeEach.
Bons estudos!