【问题标题】:Commiting transaction within test with Spring test使用 Spring 测试在测试中提交事务
【发布时间】:2014-11-14 19:45:27
【问题描述】:

我正在测试我的存储库的更新操作

@Test

    public void updateStatusByEmailWithEmailCustomer()
    {
        customerQuickRegisterRepository.save(standardEmailCustomer());

        assertEquals(CUST_STATUS_EMAIL,customerQuickRegisterRepository.findByEmail(CUST_EMAIL).getStatus());

        customerQuickRegisterRepository.updateStatusByEmail(CUST_EMAIL,STATUS_EMAIL_VERFIED ); 

        assertEquals(STATUS_EMAIL_VERFIED,customerQuickRegisterRepository.findByEmail(CUST_EMAIL).getStatus());
    }

在测试用例中,我将我的实体保存为默认状态,然后我使用 updateStatusByEmail(CUST_EMAIL,STATUS_EMAIL_VERFIED) 将其更改为其他实体,但下一个断言语句仍然失败,这是因为测试执行期间的更新在完成测试后提交....有什么方法可以在测试中提交我的更改?

【问题讨论】:

  • 你在使用休眠吗?
  • yes..hibernate 上面有 spring data jpa。
  • 测试是否在事务中运行?
  • 是的...它正在事务中运行
  • 你有没有想过事务传播REQUIRES_NEW?您可以将您的方法封装在另一个由 @Transactional(propagation = Propagation.REQUIRES_NEW) LINK 注释的方法中

标签: spring spring-transactions transactional spring-test spring-test-dbunit


【解决方案1】:

您可以通过刷新底层 Hibernate Session 来解决问题,因为这会将您的更改推送到数据库中的基础表(在当前测试管理的事务中)。

详情请在 Spring 参考手册的testing chapter 中搜索“误报”。

基本上,您需要在 update 调用之后和相应的断言之前在 current Hibernate Session 上调用 flush()

如果这不能解决您的问题,使用 Spring Framework 4.1,您可以在测试中使用新的 TestTransaction API for programmatic transaction management

问候,

Sam(spring-test 模块的负责人)

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2019-04-03
    • 2017-10-20
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2019-04-22
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多