【问题标题】:Grails 2.5.3 testing service rollback on integration tests with spockGrails 2.5.3 使用 spock 在集成测试中测试服务回滚
【发布时间】:2016-06-07 16:12:38
【问题描述】:

我有一个相当复杂的服务,它创建并保存了很多域实例,并且由于逻辑原因,我需要在不同的时间创建不同的实例,并在中间检查某些条件,这不仅仅是每个instance 是有效的,但是例如我需要检查文件系统中是否存在某些文件等。

我正在测试不正确的情况,服务会抛出异常,我需要测试如果抛出异常,没有实例持续存在。

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

所以如果回滚发生在我可以测试之后,我就无法测试了:(

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

静态事务 = 假

此后,我所有的其他测试都开始失败!

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

仅供参考:

这是我需要测试的服务:https://github.com/ppazos/cabolabs-ehrserver/blob/master/grails-app/services/com/cabolabs/ehrserver/parsers/XmlService.groovy

这是我目前的测试:https://github.com/ppazos/cabolabs-ehrserver/blob/master/test/integration/com/cabolabs/ehrserver/parsers/XmlServiceIntegrationSpec.groovy

谢谢!

【问题讨论】:

    标签: grails


    【解决方案1】:

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

    Grails 使用 Spring,Spring 事务管理器会自动回滚 RuntimeExceptions,但不会针对已检查的异常。如果您为各种验证场景抛出 RuntimeException,那么 Spring 将为您处理它。如果您依赖这些事实,那么您的测试可能会停止验证是否引发了 RuntimeException。

    如果您想使用已检查的异常(例如 javax.xml.bind.ValidationException ),那么您可以使用注解来确保它会导致回滚:

    @Transactional(rollbackFor = ValidationException.class)
    def processCommit( ....
    

    然后你的测试只需要检查

    def ex = thrown(ValidationException)
    

    更多信息请参见http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#transaction-declarative-attransactional-settings

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多