简短版本:我正在寻找一种方法,通过自动提交(Grails 2.x行为)将hibernate会话附加到集成测试线程。
我正在将插件转换为Grails 3.0.11。事情或多或少都在进步,但我发现GUI测试存在问题(使用Geb / JUnit)。我有解决办法,但它们有些难看。
Grails文档说使用@Rollback在测试中获取hibernate访问权限。问题是测试不能再提交对GUI进行处理的记录的更改。这对于GUI测试来说有点关键,可以查看我们在测试中创建的数据。
所以,我删除了@Rollback,然后我得到了关于没有为该线程分配会话的Hibernate异常:
org.hibernate.HibernateException: No Session found for current thread
我的第一个修复是使用事务处理来包装数据库访问:
User.withTransaction {
domain.save()
}
这将提交数据,但似乎需要做很多工作。我在GUI测试中做了一些数据设置,并验证它们是否与Geb / JUnit配合使用。
然后我将 @Transactional 添加到测试类的顶部。这似乎有效,但在测试完成之前不会提交。所以,我为安装方法添加了 @Transactional(propagation = Propagation.REQUIRES_NEW)。再次,一点点返工。
有没有办法将hibernate会话与JUnit测试本身相关联并且可以提交?我想要一种方法通过自动提交(Grails 2.x行为)将hibernate会话附加到集成测试线程。
我想我可以通过一些H2 JDBC选项获得自动提交。
修改:
我决定在方法级别混合使用 @Transactional (类级别), @Transactional(propagation = Propagation.REQUIRES_NEW),有时 Domain.withTransaction {} 。
有时,方法级别 @Transactional(propagation = Propagation.NEVER)将允许我在单个方法中执行 Domain.withTransaction {} 方法。
这实际上是各种策略的混乱。没有简单的全局设置。之前有点简单(我甚至想知道Grails 2.x如何处理GUI测试中的事务。现在,我怀疑它们只是自动提交了所有内容:)。