2010-09-27 65 views
8

这是我的java类:如何在单元测试期间注入PersistenceContext?

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

这是单元测试:

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

测试失败以来Finder.emNullPointerException是任何人都无法注入。我应该如何正确处理这种情况?是否存在最佳实践?

回答

7

没有像Spring这样的容器(或者类似Unitils这是基于Spring的容器),您将不得不手动注入实体管理器。在这种情况下,你可能使用像这样的基类:

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

这取决于什么你想测试。当您在Finder课程中有复杂的业务逻辑时,您可能需要模拟EntityManager - 使用模拟框架(如EasyMockMockito) - 以便单元测试该逻辑。

现在既然不是这种情况,我怀疑你想测试Employee实体的持久性(这通常被称为集成测试)。这需要使用数据库。为了简化测试并保持测试的便携性,您可以使用内存数据库(如HSQLDB)来实现此目的。为了启动HSQLDB,创建一个持久化上下文并将这个上下文注入Finder类,建议使用IoC框架如Spring

在互联网上有大量的教程解释如何使用JPA/Spring/HSQLDB。看看这个示例项目:Integration testing with Maven 2, Spring 2.5, JPA, Hibernate, and HSQLDB

+0

我在每一个单元测试来做到这一点注射“手动”,对不对? – yegor256 2010-09-27 21:00:13

+0

没有Spring可以解析@PersistenceContext注解并将它注入到Finder类中。您只需引用FinderTest中的ApplicationContext。 – 2010-09-27 21:02:32

相关问题