6
respostas

Mock está null

Olá, estou recebendo uma nullPointerException, quando vou rodar o teste. Depurando percebi que aparantemente a classe mock(leilaoDao) que criei não está sendo iniciada, e consequentemente não consegue acessar o método "buscarLeiloesExpirados".

6 respostas

Oi Felipe,

Posta o codigo completo da sua classe de teste.

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 FenalizarLeilaoServiceTest {

private FinalizarLeilaoService service;

@Mock
private LeilaoDao leilaoDao;

@Mock
public EnviadorDeEmails enviadorDeEmails;

@BeforeEach
public void beforeEach() {
    MockitoAnnotations.initMocks(this);
    this.service = new FinalizarLeilaoService(leilaoDao, enviadorDeEmails);
}

@Test
public void deveriaFinalizarUmLeilao() {
    List<Leilao> leiloes = leiloes();
    this.service = new FinalizarLeilaoService(leilaoDao, enviadorDeEmails);
    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());
    Mockito.verify(leilaoDao).salvar(leilao);
}

@Test
public void deveriaEnviarEmailParaVencedorDoLeilao() {
    List<Leilao> leiloes = leiloes();
    this.service = new FinalizarLeilaoService(leilaoDao, enviadorDeEmails);
    Mockito.when(leilaoDao.buscarLeiloesExpirados()).
            thenReturn(leiloes);
    service.finalizarLeiloesExpirados();

    Leilao leilao = leiloes.get(0);
    Lance lanceVencedor = leilao.getLanceVencedor();
    Mockito.verify(enviadorDeEmails)
            .enviarEmailVencedorLeilao(lanceVencedor);

}

@Test
public void naoDeveriaEnviarEmailParaVencedorDoLeilaoEmCasoDeErroAoEncerrarOLeilao() {

    EnviadorDeEmails enviadorDeEmails = Mockito.mock(EnviadorDeEmails.class);
    LeilaoDao leilaoDao = Mockito.mock(LeilaoDao.class);
    List<Leilao> leiloes = leiloes();
    this.service = new FinalizarLeilaoService(leilaoDao, enviadorDeEmails);
    Mockito.when(leilaoDao.buscarLeiloesExpirados()).
            thenReturn(leiloes);

    Mockito.when(leilaoDao.salvar(Mockito.any())).thenThrow(RuntimeException.class);
    try{
        service.finalizarLeiloesExpirados();
        Mockito.verifyNoInteractions(enviadorDeEmails);
    } catch ( Exception e){

    }
}
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("Cilano"),
            new BigDecimal("900"));

    leilao.propoe(primeiro);
    leilao.propoe(segundo);

    lista.add(leilao);
    return lista;
}

}

O Problema é que o método beforeEach nao esta sendo chamado, por conta do import do @Test.

Precisa importar a antoacao dos novos pacotes do JUnit. Apague o import org.junit.Test e importe essa anotacao do subpacote Jupiter, que vai resolver o problema.

É então, imaginei que fosse isso mesmo, não estou conseguindo importar o org.junit.Test. Estou recebendo este erro:

Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-vintage' failed to discover tests at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:189) at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:168) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: org.junit.platform.commons.JUnitException: Failed to parse version of junit:junit: 4.13.2 at org.junit.vintage.engine.JUnit4VersionCheck.parseVersion(JUnit4VersionCheck.java:54) at org.junit.vintage.engine.JUnit4VersionCheck.checkSupported(JUnit4VersionCheck.java:37) at org.junit.vintage.engine.JUnit4VersionCheck.checkSupported(JUnit4VersionCheck.java:32) at org.junit.vintage.engine.VintageTestEngine.discover(VintageTestEngine.java:62) at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:181) ... 6 more

Os imports devem ser estes:

import java.math.BigDecimal;
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.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

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;

Apaga os imports da sua classe, adicona esses e veja se agora resolve :)

Não foi, deve estar com algum problema nos imports aqui

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software