Question

Je suis venu du camp de printemps, je ne veux pas utiliser Spring, et je suis à émigre JavaEE6, Mais j'ai test de problème + DAO JPA, voici mon exemple simplifié:

public interface PersonDao
{
  public Person get(long id);
}

Ceci est un OTI très basique, parce que je suis venu du printemps, je crois encore OAC a sa valeur, donc je décidé d'ajouter une couche DAO.

public class PersonDaoImpl implements PersonDao , Serializable
{
  @PersistenceContext(unitName = "test", type = PersistenceContextType.EXTENDED)
  EntityManager entityManager ;

  public PersonDaoImpl()
  {
  }

  @Override
  public Person get(long id)
  {
    return entityManager .find(Person.class , id);
  }
}

Ceci est un DAO JPA mis en œuvre, j'espère que le réservoir d'EE ou le récipient de test capable d'injecter le EntityManager (comme Spring fait).

public class PersonDaoImplTest extends TestCase
{
  @Inject 
  protected PersonDao personDao;

  @Override
  protected void setUp() throws Exception
  {
    //personDao = new PersonDaoImpl();
  }

  public void testGet()
  {
    System.out.println("personDao = " + personDao); // NULL !
    Person p = personDao.get(1L);
    System.out.println("p = " + p);
  }
}

Ceci est mon fichier de test.

OK, voilà le problème: Parce que JUnit ne comprend pas @ javax.inject.Inject, le PersonDao ne sera pas en mesure d'injecter, le test échouera.

Comment puis-je trouver un cadre de test capable d'injecter le EntityManager au PersonDaoImpl et @Inject les PersonDaoImpl au PersonDao de TestCase?

J'ai essayé unitils.org, mais ne peut pas trouver un échantillon comme celui-ci, il vient d'injecter directement le EntityManagerFactory au TestCast, pas ce que je veux ...

Était-ce utile?

La solution

  

parce que je suis venu du printemps, je crois encore OAC a sa valeur, donc je décidé d'ajouter une couche DAO.

Je ne vois pas vraiment ce printemps a à voir avec cela. Et je ne suis pas d'accord comme je l'ai écrit dans une réponse précédente. Pour moi, JPA est une DAL (couche d'accès aux données), et je ne vois pas le point de mettre une couche d'accès aux données sur le dessus d'une autre couche d'accès aux données. Au moins pas de manière systématique. Mais nous allons discuter pas.

  

Ceci est un DAO JPA mis en œuvre, j'espère que le réservoir d'EE ou le récipient de test capable d'injecter le EntityManager (comme Spring fait).

Si votre DAO est un composant géré comme un CDI bean géré, le conteneur Java EE devrait être en mesure d'injecter un EntityManager en elle.

tests unitaires d'objets gérés par conteneur, vous n'avez pas besoin tout type de récipient. Car, vous aurez besoin d'une sorte de conteneur, comme vous le faites pour les haricots de printemps, les entités Hibernate / JPA, les haricots de session, le CDI a réussi les haricots ou tout autre type d'objet gérée par conteneur test d'intégration . Vous pouvez utiliser l'API EJB3.1 intégrable dans vos tests . Aussi jeter un oeil à Arquillian .

Autres conseils

Vous pouvez également ajouter la méthode PersonDaoImpl.setEntityManager(EntityManager em), puis définissez par Persistence.createEntityManagerFactory("test").createEntityManager(). Il n'y a rien avec conteneur Java EE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top