我正在编写一个JavaEE项目,并试图在路上进行一些单元测试。我们使用的单元测试框架是JUnit,Maven和Hudson用于构建和CI。
在其他测试中,我想测试 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>
答案 0 :(得分:1)
你有EntityManager.getTransaction()。begin()来启动transactiona然后rollback()来回滚它。或者您可以创建一个单独的复制的整个数据库实例来进行测试?只是一个想法。