如何在unit testing期间注入PersistenceContext?
这是我的java类:
public class Finder { @PersistenceContext(unitName = "abc") EntityManager em; public boolean exists(int i) { return (this.em.find(Employee.class, i) != null); } }
这是unit testing:
public class FinderTest { @Test public void testSimple() { Finder f = new Finder(); assert(f.exists(1) == true); } }
由于Finder.em
未被任何人注入,因此测试因NullPointerException
失败。 我应该如何妥善处理这种情况? 有没有最佳实践?
如果没有像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(); } } }
这取决于你想要测试的内容。 当你的Finder
类中有复杂的业务逻辑时,你可能想要使用像EasyMock或Mockito这样的模拟框架来模拟EntityManager
,以便对该逻辑进行unit testing。
现在,因为不是这种情况,我怀疑你想要测试Employee
实体的持久性(这通常被称为集成测试 )。 这需要使用数据库。 为了简化测试并保持测试的可移植性,您可以使用内存数据库(如HSQLDB)来实现此目的。 为了启动HSQLDB,创建一个持久化上下文并将此上下文注入到Finder类中,建议使用像Spring这样的IoC框架。
互联网上有大量的教程解释了如何使用JPA / Spring / HSQLDB。 看一下这个示例项目: 使用Maven 2,Spring 2.5,JPA,Hibernate和HSQLDB进行集成测试
- 由于Bean Validation API而无法启动Hibernate Validator
- 在WebLogic中运行时ClassNotFoundException(HqlToken)
- 将@ManyToMany关联表与额外列映射
- 缺少序列或表:hibernate_sequence
- org.hibernate.LazyInitializationException:如何正确使用Hibernate的延迟加载function
- Org.hibernate.HibernateException:没有活动事务,createQuery无效
- Hibernate可以返回除List之外的结果对象的集合吗?
- 引起:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性
- 如何查询与JPA2的M:N关系?