Grails:集成测试中的事务

标签 grails integration-testing

我有一个非常简单的设置 - 一个调用服务方法的 Controller 。在此服务中,我将一个对象保存到数据库,并使用注入(inject)的 JMSTemplate 将 JMS 消息发送到队列(一旦保存)。该服务默认启用交易。

当手动测试此功能时 - ActiveMQ 服务器关闭 - 会引发异常并且事务会回滚 - 其最终结果是对象也不会保存到数据库中。一切都好。

但是,当我通过集成测试运行此命令时(ActiveMQ 仍然处于关闭状态),我在调用 Controller 后使用计数查询来检查该对象是否未保存在数据库中,失败说计数为 1。通过在测试开始时添加另一个断言以确保计数为 0,我已确认测试开始时数据库没有任何这些对象。

这是预期的行为(可能是由于集成测试环境中事务的性质)还是我可能做错了什么?由于 JMS 服务器已关闭,该异常仍在抛出 - 并且它是一个 RuntimeException。

Grails integration tests and transactions给人的印象是这是可以预料的 - 在这种情况下,对于如何在集成测试中测试事务行为的最佳实践有什么建议吗?

最佳答案

不知道为什么每个人都发表评论而不是回答,因为评论确实暴露了答案。我会跳进去并尝试捕获答案点!

是的,在Spock测试中整个测试,包括when、then、givens等都是在同一个事务中运行的。因此,直到测试完成后您才会看到您希望的回滚。

您可以通过在测试类顶部添加“static transactional = false”将测试设置为非事务性。当然,后果是您需要在运行测试后清理数据库(如果数据库清理对您很重要)。这里的一个大问题是,Grails IntegrationSpec 类中有一个错误,每当您尝试将 transactional 设置为 false 时,该错误就会爆发。这个 SO 有一个解决这个问题的方法:

Grails 2.3 IntegrationSpec cannot be transactional false

基本上,将 grails.test.spock.IntegrationSpec 的所有代码复制到您自己的类中,并将一些方法替换为尊重测试事务性质的版本。

关于Grails:集成测试中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9866273/

相关文章:

maven - 为什么故障安全插件需要集成测试和验证目标?

asp.net-core - 使用 XUnit.NET 的集成测试 - 无法使用应用程序根找到解决方案根

Grails 无法下载代理和防火墙后面的依赖项

validation - 获取失败约束的名称

grails - Grails 2.2.0升级导致 Protocol Buffer 不匹配

scala - 无法在 Intellij Idea 中为 scala 项目运行集成测试

angularjs - Angular e2e/Karma - 在 Suite block 之前?

unit-testing - 是否有与 MSTest 的 [ClassCleanup] 和 [ClassInitialize] 等效的非静态等效项?

grails - 何时为标记库,映射等创建程序包?

angularjs - 如何将服务注入(inject) Grails 3 命令?