EntityManager nullo nas classes de teste arquillian

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;

@Test
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.

post sua classe de teste toda

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

da uma lida nesse site

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

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.

[code]

@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;
}

}[/code]

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

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

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.

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

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

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

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());
  }