【问题标题】:Spring Boot - Testing with @Transactional dangerous?Spring Boot - 使用@Transactional 进行测试危险吗?
【发布时间】:2020-01-02 18:19:37
【问题描述】:

我正在使用 Hibernate 为我们的 Spring Boot REST API 创建单元测试。我只是想知道当我使用@Transactional 时是否有问题。如果我用@Transactional 注释测试,数据将永远不会真正最终进入数据库,并且潜在的错误源将被绕过?因为某些错误仅在提交期间发生,我是否认为正确?还是我看错了?

Rollback transaction after @Test - 以下问题与我的问题不太相符。因为我想知道如何触发提交并仍然进行回滚。 EntityManager.flush() 可以做什么。我知道如何在每次测试后重置数据库。

【问题讨论】:

  • 另外,如果是单元测试,您可能希望使用模拟数据库,这样您就可以对数据进行细粒度控制。这真的取决于你想测试什么......
  • 我已经看过这个问题,但我遇到了另一个问题。我对EntityManager一无所知,我可以用flush()触发数据库验证。这使得提交变得多余,我仍然可以使用@Transactional。不过谢谢。 =)

标签: spring spring-test


【解决方案1】:

如果在测试配置中启用了事务管理,则在 spring 中测试方法执行结束时的提交存在@Commit,当然@Rollback 用于最后的回滚。对于手动事务控制,我使用TestTransaction.start()TestTransaction.end() 特别是对于一些删除和更新方法来确保和检查操作结果。(TestTransaction 需要@Commit 方法上的注释或手动设置TestTransaction.flagForCommit()

【讨论】:

  • 哦,谢谢。我以前不知道TestTransaction。这很实用。但是,如果我没看错,数据库是否必须在之后手动清空你?
  • 当然,如果数据被提交,你应该清理你的数据库,如果需要的话。
  • 好吧,好吧,从我的角度来看,这也是一个问题。因为每次清理数据库比较麻烦。显然EntityManager.flush() 触发与提交相同的操作?如果我理解正确的话,除非它最终不会出现在数据库中。
  • 对于我的意见,应该根据数据库中数据的可用性编写测试。例如,如果您为空数据库创建一些实体,最后像someRepository.count() == 1 一样验证它,我认为这是不对的。为此,我做了beforeTestQuantity = someRepository.count(),最后验证结果someRepository.count() == beforeTestQuantity + 1。为了完全确定测试结果,我更喜欢提交数据而不是刷新。
  • 嗯...对,我从来没有这样想过。我想你是正确的。我认为我以错误的方式进行了测试。
【解决方案2】:

没有必要提交。因为 EntityManager.flush() 触发相同的动作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2016-07-01
    • 2019-04-01
    • 2018-02-01
    • 2017-10-21
    • 2020-09-05
    • 2020-11-12
    相关资源
    最近更新 更多