【发布时间】:2015-01-23 17:29:20
【问题描述】:
我有一个带有 JPA/Eclipselink 的默认 Java EE 7 应用程序。 我想用 Arquillian Drone/Graphene 编写一些 UI 测试。
我的测试套件正在“工作”。我可以点击应用程序并做出一些断言。
但是:我想创建多个测试。每个测试类都应该重置数据库,以确保条件始终相同。
我正在使用 flyway 来重置我的数据库。
@Before
public void setup() {
Flyway flyway = new Flyway();
flyway.setDataSource(...);
flyway.clean();
flyway.init();
flyway.migrate();
}
重置正在工作。并且测试的第一次执行也是(在这种情况下,任何缓存中都没有任何内容)。 当我再次尝试执行测试时,数据库与奇怪的 JPA 错误不一致。 首先我认为可以:重置缓存
getEntityManager().getEntityManagerFactory().getCache().evictAll();
还不够。同样的问题。 下一个想法是销毁会话(一些 JPA 数据可以保存在旧会话中)。我还没有找到销毁所有会话的好方法。我做了一个解决方法,但这也不起作用。
我认为我有一个默认问题,但我找不到任何解决此问题的方法。
我还尝试了 dbunit 和 arquillian-persistence-extension。但这就像飞行路线,只是另一种方式。
理论上的问题是,数据库已通过 SQL 手动重置,而 Java/JPA/EclipseLink/The Sessions/deployed applaction 不知道更改的数据。 如何重置所有内容(所有缓存?)?
我还考虑过“在开始测试类之前重新部署”。但这有点过分(需要更多时间并且不是很好的解决方案)?
更多信息:我也在进行正常的 arquillian-tests(没有 UI/Selenium),这是我的 flyway 数据库重置工作。
感谢您的帮助:)。
【问题讨论】:
-
也许从发布奇怪的 JPA 问题开始,因为它们是意料之外的,并且可能指向不同的根本原因。另外,您是持有同一个 EntityManager 还是每次测试都获得一个新的?
-
一个错误例如:org.postgresql.util.PSQLException: 错误: 重复键值违反唯一约束 »abstractentity_pkey« 详细信息: 键 »(id)=(29420)« 已存在序列/seq_count在数据库中具有正确的值。一定是……在一些缓存中。
-
在我的测试套件中,我没有实体管理器(我正在使用 jdbc 连接来重置它)。在我的应用程序中,我有 @PersistenceContext(unitName = "mydatabasePU") private EntityManager em;我认为持久性上下文是每个用户会话创建的。我不能在测试套件中重用上下文?
标签: jpa eclipselink flyway jboss-arquillian