我有一个带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 / Sessions /部署的applaction对已更改的数据一无所知。 如何重置所有内容(所有缓存?)?
我还考虑过"在启动testclass"之前重新部署。但这有点太多了(需要更多时间而且不是很好的解决方案)?
还有一个信息:我也在进行正常的arquillian测试(没有UI / Selenium),这是我的flyway数据库重置工作。
感谢您的帮助:)。
答案 0 :(得分:1)
你没有说出你真正得到的错误,你刚才说:
当我再次尝试执行测试时,数据库与奇怪的JPA错误(...)
不一致
很难相信您的问题在于JPA缓存。我认为你的问题源于完全不同。
您清理数据库的方法存在根本缺陷。
您提交的代码:在所有测试之前,应该只运行一次。因为Flyway
用于准备数据库结构,而不是将其设置为已知状态
所以概念上DbUnit
& Arquillian Persistence Extension
和Flyway
会做两件完全不同的事情。
它们不是彼此的替代品。
所以你的代码使用了flyway:
@Before
public void setup() {
...
flyway.clean();
flyway.init();
flyway.migrate();
}
是错误的,因为它应该在所有测试之前只运行一次。为此,您可以使用一些容器功能:
@Singleton
+ @Startup
+ @PostConstruct
组合来启动flyway工具。init-method="migrate"
就可以了。maven
及其pre-integration-test
阶段启动飞路工具。顺便说一下:为了避免与DbUnit的xml数据集相关的维护工作,我个人推荐使用DbSetup工具。简单明了的解决方案。
除了事实之外,在测试期间更改数据库结构并不是一个好习惯 - 您的问题也可能导致Flyway和JPA使用不同的数据源(甚至指向相同的数据库)。您应该仔细检查您是否自己创建了DataSource - 只需为Flyways注入PersistenceUnit正在使用的那个。