EntityManager nullo nas classes de teste arquillian

9 respostas
F

Olá, eu sou um iniciante com arquillian e estou trabalhando com essas tecnologias:

  • jboss-as-7.1.1.Final
  • JSF 2
  • EJB3.1

Nas minhas classes de teste arquillian eu preciso usar EntityManager para complementar os testes, mas o EntityManager é sempre nulo. Estou tentando usar assim:

@PersistenceContext
EntityManager em;

<a class="mention" href="/u/test">@Test</a>

public void test1() {

Assert.assertNotNull(em);

}

Nos EJBs o EntityManager é injetado perfeitamente, só que não em classes de testes arquillian.

O que eu poderia fazer?

obrigado,
Atenciosamente.

9 Respostas

D

post sua classe de teste toda

e usa a tag [code] quando vc for postar codigos

D

da uma lida nesse site

http://arquillian.org/guides/getting_started_pt/

F

Opa, obrigado pela resposta. Usei esse site para começar os testes, baseado nele e em outros tutoriais que encontrei, era para estar funcionando. Não identifico o que pode estar errado. Pretendo a partir do momento que o entityManager estiver funcionando criar o seguinte cenário de teste: chamar uma classe que vai inserir um usuário por exemplo, então farei um select diretamente com o entityManager para conferir se o usuário foi cadastrado.

@RunWith(Arquillian.class)
public class MainTest {
	
	@Deployment()
    public static WebArchive createDeployment() {
		
        return ShrinkWrap.create(WebArchive.class, "test.war")
            .addClasses(Main.class, ClasseServico.class)
            .addAsResource("persistence.xml", "META-INF/persistence.xml")
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }
	
	@EJB
	ClasseServico classeServico;
	
	@PersistenceContext
	EntityManager em;

    @Test
    public void test1() {
    	Assert.assertNotNull(classeServico.getEntityManager());
    	Assert.assertNotNull(em);
    }
}

@Stateless
public class ClasseServico {

	@PersistenceContext
	private EntityManager entityManager;
	
	public EntityManager getEntityManager() {
		return entityManager;
	}
	
}

Na linha 21 passa, mas na 22 não.
Obrigado.

D

fiz um teste parecido com o seu, mas eu usei uma fabrica pra produzir os EntityManagers e usei a anotação @inject do cdi pra injetar no teste e funcionou legal

F

Acredito que no meu tb funcione, mas eu to tentando usar com @PersistenceContext pq como o arquillian funciona lá no servidor, teoricamente deveria funcionar. Acho que vou ter que usar um outro tipo de estratégia para esse tipo de verificação.

B

Danilo,

antes de mais nada, peço desculpas por ressuscitar o tópico, mas estou com um problema parecido com o teu. Como resolveste isso?

A titulo de informacao, injeto assim:

@PersistenceContext
EntityManager entityManager;

Quando executo em algum metodo qualquer de um managedbean de teste e com o servidor rodando, roda beleza.

Mas quando faço isso numa classe teste, dá pau, porque o entitymanager vem nulo.

Olha minha classe teste:

@Named(value = "cepTest")
public class CepTest {

    @PersistenceContext
    EntityManager entityManager;

    public CepTest() {
    }

    @Before
    public void setUp() {
//        em = Persistence.createEntityManagerFactory("triplice_B2C").createEntityManager();
    }

    @Test
    public void buscaCEPs() {

        System.out.println(entityManager);

        Query q = entityManager.createQuery("select o from VendaWeb");

        System.out.println(q.getResultList());


    }
}

Agradeço qualquer ajuda.

Giovanni

D

o @PersistenceContext so funciona quando sua classe é gerenciada pelo servidor de aplicação, mas com vc ta usando uma classe de teste que esta gerenciando a classe é o junit, e ele não conhece a @PersistenceContext e não vai injetar o EntityManager

B

Tem jeito de resolver isso, Danilo? Alguém falou algo sobre o entitymanagerfactory, mas to me enrolando cada vez mais nisso…

A

oi Bonissauro,

faça como te falei no post anterior

ex:

@Test
  public void testEmFactoryJPA() {
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("suaUnidadeDePersistencia");

    Query query = em.createQuery("SELECT t FROM Table t");
    List<Tabela> registros = query.getResultList();
    em.close();

    assertFalse(registros.isEmpty());
  }
Criado 12 de março de 2013
Ultima resposta 21 de jul. de 2013
Respostas 9
Participantes 4