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

Como ficam os testes de unidade em uma aplicação sem um contêiner de injeção de dependência?

Olá, como ficariam os testes de uma classe sem injeção de dependência, em que posso ter uma composição de vários objetos, sendo que alguns deles somente são instanciados em alguns métodos da classe que quero testar? Devo criar um construtor com todos os atributos da classe já instanciados? Devo instanciar todos os atributos na hora da declaração dos mesmos?

Desde já, muito obrigado!

1 resposta
solução!

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!