Grails2.5.3测试服务在与spock的集成测试上回滚 我有一个相当复杂的服务,它创建并保存了很多域实例,并且由于逻辑,我需要在不同的时间创建不同的实例,并且在中间检查某些条件,这不仅是每个实例都是有效的,而且例如,我需要检查文件系统中是否存在某些文件,等等。

Grails2.5.3测试服务在与spock的集成测试上回滚 我有一个相当复杂的服务,它创建并保存了很多域实例,并且由于逻辑,我需要在不同的时间创建不同的实例,并且在中间检查某些条件,这不仅是每个实例都是有效的,而且例如,我需要检查文件系统中是否存在某些文件,等等。,grails,Grails,我正在测试不正确的情况,即服务抛出异常,并且我需要测试如果抛出异常,是否没有持久化的实例 一个特定的测试用例失败,即使引发了预期的异常,也会将域实例保存到数据库中。然后我读到,因为集成测试本身是事务性的,所以回滚实际上发生在测试结束时,而不是在使用服务之后,因此我可以检查spock测试用例的“Then”部分的条件 因此,如果回滚发生在我可以测试它之后,我就不能测试它:( 然后我读到让集成测试不是事务可能会有所帮助,所以我补充说: 静态事务=false 在这之后,我所有的其他测试都失败了 我的问题

我正在测试不正确的情况,即服务抛出异常,并且我需要测试如果抛出异常,是否没有持久化的实例

一个特定的测试用例失败,即使引发了预期的异常,也会将域实例保存到数据库中。然后我读到,因为集成测试本身是事务性的,所以回滚实际上发生在测试结束时,而不是在使用服务之后,因此我可以检查spock测试用例的“Then”部分的条件

因此,如果回滚发生在我可以测试它之后,我就不能测试它:(

然后我读到让集成测试不是事务可能会有所帮助,所以我补充说:

静态事务=false

在这之后,我所有的其他测试都失败了

我的问题是:当抛出异常时,测试应该回滚的服务的正确方法是什么?我只需要验证异常发生后,数据库没有任何更改(因为这是一个医疗保健应用程序,数据一致性是关键)

供参考:

这是我需要测试的服务:

这是我目前的测试:


谢谢!

如果您可以修改代码以依赖框架,那么您就不需要测试框架

Grails使用Spring,Spring事务管理器会自动回滚RuntimeException,但不会回滚已检查的异常。如果您为各种验证场景抛出RuntimeException,则Spring会为您处理。如果您依赖于这些事实,则测试可能会在验证是否抛出RuntimeException时停止。

如果要使用选中的异常(如javax.xml.bind.ValidationException),则可以使用注释确保它导致回滚:

@Transactional(rollbackFor = ValidationException.class)
def processCommit( ....
然后你的测试只需要检查一下

def ex = thrown(ValidationException)
有关更多信息,请参阅