我正在编写一个JavaEE项目,并试图在途中得到一些单元测试。我们使用的单元测试框架是JUnit,以及用于构建和CI的Maven和Hudson。
在其他测试中,我想测试JPA-2.0查询逻辑,因为这是我们项目的核心功能之一。我们实现了相当复杂的查询逻辑,这也允许用户犯错误,拼写错误等等,所以我们想让shure相信这是可行的。
查询本身是使用JPA-2.0条件API和Metamodel动态构造的。
现在,在我的单元测试中,我设置了持久性并创建了如下所示的EntityManager:
protected static EntityManagerFactory emf;
protected static EntityManager em;
emf = Persistence.createEntityManagerFactory("persistenceUnitName");
em = emf.createEntityManager();这是可行的,我也可以查询DB --但这不是我想要的。
我想做的是:
由于我们不想测试DB中的数据,所以计划首先创建一些实体,然后持久化它们。然后运行查询并确保得到正确的结果。最后,由于单元测试持久性没有在事务中运行,因此实体从未持久化到DB,并且DB保持不变(这正是我们想要的)。
Entity entity = new Entity();
entity.setAttribute("stuff");
//...
em.persist(entity);
// ...
// Here comes the query which should find above entity with attribute 'stuff'...但。无论我在单元测试中创建和坚持什么实体,都不能从同一测试(甚至方法)中找到。我可以成功地查询DB并从中查找实体,但是新持久化的测试用例并不存在。
我想我误解了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>发布于 2011-08-19 11:01:52
您可以让EntityManager.getTransaction().begin()启动transactiona,然后让rollback()回滚。或者,您可以创建一个单独复制的整个数据库的实例,只是为了测试?只是个主意。
https://stackoverflow.com/questions/7119271
复制相似问题