Grails 2.3 IntegrationSpec 不能是事务性错误
Posted
技术标签:
【中文标题】Grails 2.3 IntegrationSpec 不能是事务性错误【英文标题】:Grails 2.3 IntegrationSpec cannot be transactional false 【发布时间】:2013-12-21 19:14:30 【问题描述】:我最近升级到 Grails 2.3 并尝试将所有旧测试迁移到 spock 集成测试。但它在清理时失败了,因为我的测试是非事务性的。 Grails 文档说测试可以是非事务性的,但我们需要手动处理它,但这里似乎不太合适。因为我在扩展 IntegrationSpec 的每个集成测试中都遇到了这个错误
java.lang.IllegalStateException: Cannot deactivate transaction synchronization - not active
at grails.test.spock.IntegrationSpec.cleanup(IntegrationSpec.groovy:72)
这样的简单测试会抛出该错误:
import grails.test.spock.IntegrationSpec
public class DummySpec extends IntegrationSpec
static transactional = false
def setup()
def cleanup()
def testDummy()
expect:
1 == 1
【问题讨论】:
【参考方案1】:我也遇到过!很确定它是一个 grails 错误...我提交了一个 jira 和一个 patch。
抛出错误是因为 grails.test.spock.IntegrationSpec 中的代码在调用 interceptor.destroy()
之前没有检查 interceptor.isTransactional()
def cleanup()
perMethodRequestEnvironmentInterceptor?.destroy()
perMethodTransactionInterceptor?.destroy() //breaks :(
...
private GrailsTestTransactionInterceptor initTransaction()
def interceptor = new GrailsTestTransactionInterceptor(applicationContext)
if (interceptor.isTransactional(this)) interceptor.init() //also need for destroy()
interceptor
我的解决方法是添加以下代码:
def cleanup()
perMethodRequestEnvironmentInterceptor?.destroy()
destroyTransaction(perMethodTransactionInterceptor)
...
private void destroyTransaction(GrailsTestTransactionInterceptor interceptor)
if (interceptor?.isTransactional(this)) interceptor.destroy()
要暂时解决问题,您可以使用修补后的代码创建自己的 com.myname.IntegrationSpec 并对其进行扩展,而不是 grails.test.spock.IntegrationSpec。不理想......但它有效:)
【讨论】:
【参考方案2】:Grails 2.3 默认随 Spock 一起提供。只需删除您自己定义的 spock 依赖项,确保导入 grails.test.spock.IntegrationSpec 并且它应该可以工作。
【讨论】:
以上是关于Grails 2.3 IntegrationSpec 不能是事务性错误的主要内容,如果未能解决你的问题,请参考以下文章
Grails 2.3 IntegrationSpec 不能是事务性错误
Grails 2.3 数据库迁移上的“加载插件管理器时出错:TomcatGrailsPlugin”
Grails 2.3 将 css font-face url 更改为“resource:/...”
Grails 3.3.9 spring security 3.2.3 spring security ui 3.1.2 无法更改用户数据