2010-09-27 8 views
8

C'est ma classe java:Comment injecter PersistenceContext pendant un test unitaire?

public class Finder { 
    @PersistenceContext(unitName = "abc") 
    EntityManager em; 
    public boolean exists(int i) { 
    return (this.em.find(Employee.class, i) != null); 
    } 
} 

C'est le test unitaire:

public class FinderTest { 
    @Test public void testSimple() { 
    Finder f = new Finder(); 
    assert(f.exists(1) == true); 
    } 
} 

test échoue avec NullPointerException depuis Finder.em n'est pas injecté par personne. Comment dois-je gérer cette situation correctement? Existe-t-il une meilleure pratique?

Répondre

7

Sans un conteneur comme Spring (ou quelque chose comme Unitils - qui est basé sur Spring), vous devrez injecter le gestionnaire d'entités manuellement. Dans ce cas, vous pourrait utiliser quelque chose comme cela comme classe de base:

public abstract class JpaBaseRolledBackTestCase { 
    protected static EntityManagerFactory emf; 

    protected EntityManager em; 

    @BeforeClass 
    public static void createEntityManagerFactory() { 
     emf = Persistence.createEntityManagerFactory("PetstorePu"); 
    } 

    @AfterClass 
    public static void closeEntityManagerFactory() { 
     emf.close(); 
    } 

    @Before 
    public void beginTransaction() { 
     em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
    } 

    @After 
    public void rollbackTransaction() { 
     if (em.getTransaction().isActive()) { 
      em.getTransaction().rollback(); 
     } 

     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 
3

Cela dépend de que vous voulez tester. Lorsque vous avez une logique métier complexe dans votre classe Finder, vous pouvez vous moquer du EntityManager - en utilisant un cadre de simulation comme EasyMock ou Mockito - afin de tester cette logique.

Maintenant, puisque ce n'est pas le cas, je suppose que vous voulez tester la persistance de l'entité Employee (ce qui est souvent appelé tests d'intégration). Cela nécessite l'utilisation d'une base de données. Pour faciliter les tests et garder vos tests portables, vous pouvez utiliser une base de données en mémoire comme HSQLDB à cette fin. Pour démarrer HSQLDB, créer un contexte de persistance et injecter ce contexte dans votre classe Finder, il est conseillé d'utiliser un framework IoC tel que Spring.

Il existe de nombreux didacticiels sur Internet qui expliquent comment utiliser JPA/Spring/HSQLDB. Jetez un oeil à cet exemple de projet: Integration testing with Maven 2, Spring 2.5, JPA, Hibernate, and HSQLDB

+0

que je dois faire dans chaque test unitaire cette injection « manuellement », non? – yegor256

+0

Aucun ressort ne peut analyser l'annotation @PersistenceContext et l'injecter dans votre classe Finder. Vous devez juste vous référer au ApplicationContext du FinderTest. –

Questions connexes