我只是在一个项目中将Groovy版本从1.76升级到2.1,我有一个单元测试如下:
try{
sql.withTransaction{
sql.execute("Update table set name='tested' where id = 1")
throw new Exception()
}
}
catch(ignore){}
//Assert that name has been rolled back from update to 'tested'
以前在1.76中,这工作正常 - 抛出的异常导致事务回滚,一切正常。但是,2.1中的情况并非如此 - 我已经看到,如果我更改我的异常以抛出RuntimeException
,那么它会正确回滚。
我的假设是Groovy不再为已检查的异常回滚我的事务 - 这是可以配置的吗?我可以在所有事务上进行回滚,而不是必须返回并更新我的所有代码以在捕获异常时显式回滚吗?
答案 0 :(得分:1)
throw new SQLException()
应该回滚事务。
SQLException
,RuntimeException
和Error
在withTransaction
内被捕获,并作为SQLException
重新投放,最终会回滚事务。 @摘自groovy来源。
要覆盖为所有测试抛出SQLException的功能,可以在setUp中将其模拟为
Sql.metaClass.withTransaction = {Closure clos ->
throw new SQLException()
}