我最近升级到Grails 2.3并尝试将所有旧测试迁移到spock集成测试。但它在清理时失败,因为我的测试是非事务性的。 Grails doc说测试可以是非事务性的,但是我们需要手动处理它,但这里似乎不太正确。因为我在扩展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
}
}
答案 0 :(得分:3)
我也碰到了这个!很确定它是一个grails bug ...我提交了jira和patch。
抛出错误是因为grails.test.spock.IntegrationSpec中的代码在调用interceptor.isTransactional()
之前没有检查interceptor.destroy()
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。不理想......但它有效:)
答案 1 :(得分:2)
Grails 2.3默认使用Spock。只需删除你自己定义的spock依赖项,确保导入grails.test.spock.IntegrationSpec,它应该可以工作。