1

我只是在一个项目中将 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 中情况并非如此——而且我已经看到,如果我将异常更改为 throw aRuntimeException那么它会正确回滚。

我的假设是 Groovy 不再为检查的异常回滚我的事务 - 这是可以配置的吗?我可以让它在所有事务上回滚,而不是在捕获异常时返回并更新我的所有代码以显式回滚吗?

4

1 回答 1

1

throw new SQLException()应该回滚事务。

SQLException,RuntimeException并被Error捕获withTransaction并重新抛出,SQLException最终事务回滚。@来自常规来源的摘录。

要覆盖为所有测试抛出 SQLException 的功能,您可以在 setUp 中将其模拟为

Sql.metaClass.withTransaction = {Closure clos ->
   throw new SQLException()
}
于 2013-05-23T04:11:36.120 回答