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

EJB - Problema

Classe para testar se o método funciona

package br.com.webservice.teste;

import java.sql.SQLException;
import java.util.List;

import javax.ejb.Stateless;
import javax.enterprise.inject.Model;
import javax.inject.Inject;

import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

import br.com.webservice.dao.TesteDAO;
import br.com.webservice.model.Tasklist;
import br.com.webservice.service.TaskDAO;

public class Teste {
    @Inject
    private TaskDAO dao;

    private TesteDAO dao1 = new TesteDAO();

    Tasklist task1 = new Tasklist();


    @Test
    @Ignore
    public void salvar() throws SQLException {

        task1.setDescricao("Oi");
        task1.setCriacao("00");
        dao1.salvar(task1);
    }

    @Test
    public void listar(){
        List<Tasklist> lista = dao.listarTodos();
        for(Tasklist task : lista){
            System.out.println(task);
        }
    }
}

Classe DAO para fazer a persistência dos dados.

package br.com.webservice.service;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import br.com.webservice.model.Tasklist;

@Stateless
public class TaskDAO {

    @PersistenceContext
    private EntityManager entity;

    public void salvar(Tasklist task) {
        entity.merge(task);
    }

    public void deletar(Tasklist task) {
        entity.remove(task);
    }

    public List<Tasklist> listarTodos() {
        return entity.createQuery("select t from Tasklist t", Tasklist.class)
                .getResultList();
    }
}






ERRO:

java.lang.NullPointerException
    at br.com.webservice.teste.Teste.listar(Teste.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
3 respostas

Oi Vitor. Está acontecendo uma NullPointerException Essa exception ocorre quando você está tentando acessar um método ou uma propriedade de um objeto que ainda não foi inicializado. Se você olhar a primeira linha da stacktrace vai ver isso:

at br.com.webservice.teste.Teste.listar(Teste.java:38)

essa linha significa que o problema ocorreu na classe Teste dentro do método listar.

Dando uma olhada em seu método eu vi que você está fazendo isso:

List<Tasklist> lista = dao.listarTodos();

mas eu não vi em nenhum lugar você inicializar seu DAO, você precisa fazer um @Before em sua classe de testes que construa os objetos que você vai usar

Abraços!

Oi Philipe, coloquei o @Before no método de teste e no método do DAO, continuou com o mesmo problema, tentei colocar a anotação na classe, mas não tem, tem outra solução?

Vi em vídeo aulas que o @Inject trata sobre instância de objetos, e eu coloquei a anotação em cima do objeto.

@Inject
private TaskDAO dao;
solução!

Oi Victor, o @Before não é para daos, é uma anotação do junit que marca um método que vai ser rodado antes de rodar cada um dos seus métodos de teste.

já o @Inject é para ser usado em seus controllers, DAOs e outros componentes para injeção de dependências, infelizmente ele não funciona em testes, você precisa criar suas dependências você mesmo.

Eu te aconselho a fazer nosso curso sobre testes em Java antes de continuar seu projeto, nele você vai aprender várias coisas como essas que eu te expliquei, e mais algumas outras que vão te ensinar a usar todos os recursos.

https://www.alura.com.br/curso-online-tdd

Se você quiser, como complemento desse primeiro curso, temos também esse aqui:

https://www.alura.com.br/curso-online-mock

Nele você vai aprender a usar Mocks, algo que é bastante útil enquanto você está desenvolvendo seus testes.

Abraços!