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".
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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".
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