4
respostas

java.lang.AssertionError: expected:<2023-05-12> but was:<2020-12-08>

Eu gostaria de saber onde está o erro no meu teste. Quando eu realizo o teste e não coloco o clock dentro do

Assert.assertEquals(LocalDate.now().plusDays(1),
                pagamento.getVencimento());

falha o teste , mas ado eu coloco o teste da certo.

Assert.assertEquals(LocalDate.now(clock).plusDays(1),
                pagamento.getVencimento());

Pq acontece isso? Visto no curso o professor não coloca o clock no localDate.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

localDate com clock;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

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;

    }
}

Olá, Getúlio! Tudo bem?

Bom, a explicação é que o LocalDate.now() retorna a data atual do sistema no momento em que o método é chamado. Já o LocalDate.now(clock) retorna a data atual do sistema de acordo com o relógio fornecido.

No seu caso, você está testando uma classe que possui um vencimento de pagamento, que deve ser um dia após a data atual. Se você não usa o clock, o teste pode falhar porque a data atual do sistema pode ser diferente da data em que o teste foi criado. Já com o clock, você garante que a data atual usada no teste é a mesma que você definiu, evitando possíveis falhas.

Espero ter ajudado a esclarecer suas dúvidas! Se ainda tiver alguma, é só perguntar.

Bons estudos!

Mas isso significa que o meu código está errado ?Pq no curso ele não usa o clock dentro deste localDate. O que posso fazer pra ele nao falhar como na aula? Ah obrigado pela a explicação.

No geral não!

Cara mexer com datas em testes geralmente é bem chatinho mesmo, o melhor dos mundos é sempre mockar tudo..

No caso quando vc pega o momento de agora do local date, ele realmente vai levar em consideração a hora que esta configurada na jvm, quando vc passa o clock vc meio que mock isso para dentro dele e ele consegue pegar certinho.