Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Ao executar está dando NullPointerException

Ao executar o teste estoura essa exceção de NullPointerException. Apontando para esta linha: Mockito.when(leilaoDao.buscarLeiloesExpirados()).thenReturn(leiloes);

java.lang.NullPointerException
    at br.com.alura.leilao.service.FinalizarLeilaoServiceTest.deveriaFinalizarUmLeilao(FinalizarLeilaoServiceTest.java:35)
    at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)

Fiz as alterações apresentadas na aula. Segue a classe FinalizarLeilaoServiceTest

package br.com.alura.leilao.service;

import br.com.alura.leilao.dao.LeilaoDao;
import br.com.alura.leilao.model.Lance;
import br.com.alura.leilao.model.Leilao;
import br.com.alura.leilao.model.Usuario;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


public class FinalizarLeilaoServiceTest {

    private FinalizarLeilaoService service;
    @Mock
    private LeilaoDao leilaoDao;

    @BeforeEach
    public void beforeEach(){
        MockitoAnnotations.initMocks(this);
        this.service = new FinalizarLeilaoService(leilaoDao);
    }
    @Test
    public void deveriaFinalizarUmLeilao(){
        List<Leilao> leiloes = leiloes();

        //Mockito, quando o método buscarLeiloesExpirados fora chamado devolva essa lista leiloes
        Mockito.when(leilaoDao.buscarLeiloesExpirados()).thenReturn(leiloes);

        service.finalizarLeiloesExpirados();

        Leilao leilao = leiloes.get(0);
        Assert.assertTrue(leilao.isFechado());
        Assert.assertEquals(new BigDecimal("900"), leilao.getLanceVencedor().getValor());

        //O método verify internamente já vai fazer um assert pra mim, ele vai verificar se o método salvar foi chamado.
        Mockito.verify(leilaoDao).salvar(leilao);
    }

    private List<Leilao> leiloes() {
        List<Leilao> lista = new ArrayList<>();

        Leilao leilao = new Leilao("Celular",
                new BigDecimal("500"),
                new Usuario("Fulano"));

        Lance primeiro = new Lance(new Usuario("Beltrano"),
                new BigDecimal("600"));
        Lance segundo = new Lance(new Usuario("Ciclano"),
                new BigDecimal("900"));

        leilao.propoe(primeiro);
        leilao.propoe(segundo);
        lista.add(leilao);
        return lista;

    }
}

Segue a classe FinalizaLeilaoService

package br.com.alura.leilao.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.alura.leilao.dao.LeilaoDao;
import br.com.alura.leilao.model.Lance;
import br.com.alura.leilao.model.Leilao;

@Service
public class FinalizarLeilaoService {

    private LeilaoDao leiloes;

    @Autowired
    public FinalizarLeilaoService(LeilaoDao leiloes) {
        this.leiloes = leiloes;
    }


    public void finalizarLeiloesExpirados() {
        List<Leilao> expirados = leiloes.buscarLeiloesExpirados();
        expirados.forEach(leilao -> {
            Lance maiorLance = maiorLanceDadoNoLeilao(leilao);
            leilao.setLanceVencedor(maiorLance);
            leilao.fechar();
            leiloes.salvar(leilao);
        });
    }

    private Lance maiorLanceDadoNoLeilao(Leilao leilao) {
        List<Lance> lancesDoLeilao = new ArrayList<>(leilao.getLances());
        lancesDoLeilao.sort((lance1, lance2) -> {
            return lance2.getValor().compareTo(lance1.getValor());
        });
        return lancesDoLeilao.get(0);
    }

}
2 respostas
solução!

Oi Michelle,

O problema é que o JUnit não chamou o método anotado com @BeforeEach e por isso o atributo leilaoDao está null.

Isso está acontecendo porque você está importando classes do JUnit 4 e outras do JUnit 5, causando conflito.

O import da anotação @Test deve ser feito do pacote do junit 5: org.junit.jupiter.api.Test.

Obrigada, não tinha reparado nessa questão do importe de classes do JUnit 4 e outras do JUnit 5

Fiz a alteração e o teste passou. Muito obrigada pelo suporte