gpt4 book ai didi

Grails:集成测试中的事务

转载 作者:行者123 更新时间:2023-12-02 09:07:31 25 4
gpt4 key购买 nike

我有一个非常简单的设置 - 一个调用服务方法的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com