如何回滚单元测试,而服务层是@Transactional
我使用springboot 1.5.2.RELEASE和我的服务类是annoted与如何回滚单元测试,而服务层是@Transactional
@Service
@Transactional(rollbackFor = Exception.class)
我的单元测试类与注释:
@RunWith(SpringRunner.class)
@SpringBootTest
需要量:试验结束后回滚单元测试方法在数据库中的改变。
提出的解决方案之一:就是在测试类中添加@Transactional
注解,我尝试过,但这种解决方案会产生一些问题,就是有时候测试事务回滚之前(即使没有任何异常抛出!)服务交易完成!
任何人都可以提供另一个好的解决方案来回滚测试吗?
测试类上的@Transactional
解决方案是执行此操作的标准方法。 Spring Tx没有办法将事务回滚到蓝色之外,所以我建议您仔细研究遇到的问题,而不是发明其他解决方案。
如果不更改默认行为,所有更改都将被回滚。而你没有与事务传播级别= REQUIRES_NEW类/方法,因为它开始独立交易,并且可以提交或与外部事务回滚独立
事务回滚和提交行为
默认情况下,测试交易将在 完成测试后自动回滚;然而,事务提交和回滚 行为可以通过@Commit和@Rollback 注释以声明方式配置。
@Rollback
@Rollback指示是否与测试方法完成后的一个事务性测试方法 事务应该回滚。如果 为真,则事务回滚;否则,交易是 承诺(另请参阅@Commit)。即使未明确声明@Rollback ,Spring TestContext框架中的集成测试 的回滚语义默认为true。
当作为类级注释声明时,@Rollback为测试类 层次结构中的所有测试方法定义 默认回滚语义。当声明为方法级批注时,@Rollback 为特定测试方法定义回滚语义,可能为 覆盖类级别的@Rollback或@Commit语义。
奇怪的是,我没有使用传播新的和默认行为是没有回滚,你有什么建议? –
1)我写了 - '你没有'。 2)即使在测试完成后回调中的回滚成功事务。这是测试的默认行为。如果你需要保存更改,并且不要在测试类或方法 – xyz
从docs:
默认情况下,测试数据将被自动 完成测试后回滚;然而,事务提交和回滚行为可以通过@Commit和@Rollback注释声明性地配置。
您的评论:
有时测试交易服务交易之前回滚(!即使没有任何 抛出异常)完成!
对我没有意义。你怎么知道txn是否已完成或者是否已经回滚?例外情况对测试无关紧要,因为我引用了上述文档。
在控制台中,我看到日志:回滚事务,并且在我的单元测试方法内调用某些方法之前,有时会记录此事(有时并不总是)。 –
@MahmoudS测试完成后测试数据是否留在数据库中? –
当我在测试类中使用transacional时,测试数据不会遗留,但正如我所说有时测试会无缘无故地回滚并跳过调用某些方法! –
中使用@Rollback(false),那么这可能是迄今为止最好的建议,我会在我的测试方法中深入探讨可能导致此行为的原因。 –