gpt4 book ai didi

java - 在 spring testng 测试方法上禁用事务

转载 作者:行者123 更新时间:2023-11-29 03:13:30 25 4
gpt4 key购买 nike

我将 TestNG 与 Spring 和 JPA 一起使用。到目前为止,我正在使用我的测试类来测试数据库内容,它扩展了 AbstractTransactionalTestNGSpringContextTests。使用 @TransactionConfiguration(defaultRollback = true) 一切正常,我不需要担心清理。 Spring 在我的每个测试方法的开头创建一个默认事务,然后回滚。这是解决著名的“交易测试被认为是有害的”问题的一个非常巧妙的技巧。

不幸的是,我需要此类中的一个方法(一个测试)没有此默认事务。这是因为此测试方法模拟批处理,并且我在其中有多个独立于生产的事务。我能够模拟和解决问题的唯一方法是使用 Propagation.REQUIRES_NEW 配置这些内部事务,但我不想在生产代码中使用。有什么方法可以为我的特定测试方法禁用 Spring 事务(所以我不需要在我的服务方法中使用 Propagation.REQUIRES_NEWPropagation.REQUIRED )?

最佳答案

我知道你已经解决了你的问题,但是对于将来会来这里的人......

不幸的是,似乎没有办法在使用 @Transactional 注释的测试中禁用现有事务。

恕我直言,这里的 Spring 方法非常不灵活。但是有一个解决方法可以解决您的问题。将所需的逻辑封装在 Spring TransactionTemplate 类中就足够了。这将确保您的测试用例中的代码将在新事务中启动。


个人建议:从我的角度来看,最好和最灵活的方法是从一开始就放弃 @Transactional 测试并将数据库设置为已知状态 每次测试之前。这样,Spring 将以与生产中完全相同的方式管理事务。
没有怪癖,没有黑客,没有手动交易管理。

我知道使用 @Transactional 和围绕单元测试的“回滚”策略是一个诱人的想法,但它有太多的陷阱。我推荐阅读这篇文章 Spring Pitfalls: Transactional tests considered harmful .

当然,我不会在这里提示 @Transactional 本身 - 因为它极大地简化了生产代码中的事务管理。

关于java - 在 spring testng 测试方法上禁用事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987097/

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