Grails 2.3 IntegrationSpec不能是事务性错误

时间:2013-12-05 01:59:19

标签: grails spock transactional grails-2.3

我最近升级到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
   }
}

2 个答案:

答案 0 :(得分:3)

我也碰到了这个!很确定它是一个grails bug ...我提交了jirapatch

抛出错误是因为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,它应该可以工作。