gpt4 book ai didi

grails - 与启用事务的其他集成测试一起运行时,集成测试失败

转载 作者:行者123 更新时间:2023-12-04 15:34:06 24 4
gpt4 key购买 nike

我在测试多个服务的集成测试时遇到问题。我必须禁用事务性才能使测试正常工作,而不会出现任何与事务性相关的运行时错误。集成测试在单独运行时工作正常,但在与启用事务的其他测试一起运行时,它会产生以下运行时错误:

Running 48 integration tests... 43 of 48
Failure: Tests the happy case flow of MyService.(MyServiceSpec)
org.springframework.transaction.HeuristicCompletionException: Heuristic completion: outcome state is rolled back; nested exception is org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has bee
n marked as rollback-only
Caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
... 4 more
Completed 43 integration tests, 1 failed in 0m 32s

我得出的结论是,运行时发生的原因是因为其他使用事务的集成测试,因为我通过成功运行所有禁用事务的测试来测试这一点;并且在使用启用事务的单个集成测试运行测试时失败。

如何在 Grails 中混合使用事务性和非事务性集成测试?

平台详情:

Grails-2.3.6 Windows 7 64 位。 JDK v6。

最佳答案

使用 Grails 2.4.3 遇到了这个问题,经过一系列调试后,在 org.springframework.orm.hiberante4.HibernateTransactionManager.doGetTransaction() 中看到了这一点。它调用 TransactionSynchronizationManager.getResource(getSessionFactory())如果还有其他启用事务的测试,那么它将找到一个线程绑定(bind)的 SessionHolder,其 rollbackOnly 设置为 true(因为之前的测试回滚了)。所以,当它第一次尝试提交事务时,它会看到这个并给出 UnexpectedRollbackException你表示。

我通过将以下内容放入标记为非事务性的测试的 setUp() 中解决了这个问题:

Holders.grailsApplication.mainContext.getBeansOfType(SessionFactory.class).each { beanName, sessionFactory ->

SessionHolder sessionHolder = TransactionSynchronizationManager.getResource(sessionFactory)

if (sessionHolder) {
sessionHolder.clear()
}
}

关于grails - 与启用事务的其他集成测试一起运行时,集成测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23999362/

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