【发布时间】:2011-08-19 19:01:52
【问题描述】:
我正在编写一个 JavaEE 项目,并且正在尝试进行一些单元测试。我们使用的单元测试框架是 JUnit,以及用于构建和 CI 的 Maven 和 Hudson。
在其他测试中,我想测试 JPA-2.0 查询逻辑,因为这是我们项目的核心功能之一。我们实现了相当复杂的查询逻辑,它还允许用户犯错、拼写错误等,因此我们希望确保它能够正常工作。
查询本身是使用 JPA-2.0 Criteria API 和 Metamodel API 动态构建的。
现在,在我的单元测试中,我设置了持久性并像这样创建了一个 EntityManager:
protected static EntityManagerFactory emf;
protected static EntityManager em;
emf = Persistence.createEntityManagerFactory("persistenceUnitName");
em = emf.createEntityManager();
这行得通,我也可以查询数据库——但这不是我想要的。
我想要做什么:
由于我们不希望数据库中的测试数据,计划是首先创建一些实体,然后持久化它们。然后我们会运行我们的查询并确保我们得到正确的结果。最后,由于单元测试持久性不在事务中运行,实体永远不会持久化到 DB,并且 DB 保持不变(这是我们想要的)。
Entity entity = new Entity();
entity.setAttribute("stuff");
//...
em.persist(entity);
// ...
// Here comes the query which should find above entity with attribute 'stuff'...
但是。无论我在单元测试中创建和坚持的任何实体,都无法在同一个测试(甚至方法)中找到。我可以成功查询数据库并从那里找到实体,但是新持久化的测试用例不存在。
我想我误解了关于 JPA 持久性上下文的一些关键问题 - 如果有人能启发我,我会很高兴! :)
在重要的情况下,测试使用的 persistence.xml 如下所示:
<persistence-unit name="persistenceUnitName" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- list of classes to manage -->
<properties>
<!-- driver and connection info, this works-->
</properties>
</persistence-unit>
【问题讨论】:
标签: jakarta-ee junit persistence ejb jpa-2.0