【问题标题】:Spring: Rollback transactin in UnittestSpring:单元测试中的回滚事务
【发布时间】:2020-09-11 05:37:06
【问题描述】:

我有一个复杂的服务方法,它从数据库加载大量数据。因为它只读取和验证数据,所以我想确保

  1. JPA (Hibernate) 不会浪费时间检查大持久性 变化的背景。
  2. 不会写入数据的意外更改 到数据库。

因此,在我的服务即将结束时,我有此代码

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

我的单元测试对所有数据库访问都进行了模拟,因此事务处理不是问题。 (我有 @SpringBootTest 的集成测试和完整的 trx 支持。)不幸的是,回滚语句在纯单元测试中失败。

有没有一种简单的方法可以让回滚语句在单元测试的情况下什么也不做?

【问题讨论】:

  • 你有休眠的自动提交,你调用的方法的传播级别是多少?
  • 这是一个纯单元测试。没有数据库,休眠,事务。我只想测试服务的内部逻辑。一切都回滚的事实只是一种安全/性能措施。

标签: java spring spring-boot transactions spring-transactions


【解决方案1】:

现在我只写了一个易于模拟的小组件:

@Component
public class RollBacker {

    public void setRollBackOnly() {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }

}

毕竟这是TransactionAspectSupport 的单例方法,这使得单元测试在这里变得困难。恕我直言TransactionAspectSupport 应该是春豆。

【讨论】:

    【解决方案2】:

    考虑使用@Transactional(readOnly=true) 而不是TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

    Doc

    如果事务实际上是只读的,则可以设置为 true 的布尔标志,允许在运行时进行相应的优化。

    【讨论】:

    • 如问题中所述,没有@SpringBootTest。我没有,在这种情况下也不想要事务甚至完整的应用程序上下文。只是一个普通的单元测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2015-06-19
    • 2011-10-04
    • 1970-01-01
    • 2016-09-07
    • 2014-12-20
    • 2016-10-07
    相关资源
    最近更新 更多