如何回滚单元测试,而服务层是@Transactional

问题描述:

我使用springboot 1.5.2.RELEASE和我的服务是annoted与如何回滚单元测试,而服务层是@Transactional

@Service 
@Transactional(rollbackFor = Exception.class) 

我的单元测试类与注释:

@RunWith(SpringRunner.class) 
@SpringBootTest 

需要量:试验结束后回滚单元测试方法在数据库中的改变。

提出的解决方案之一:就是在测试类中添加@Transactional注解,我尝试过,但这种解决方案会产生一些问题,就是有时候测试事务回滚之前(即使没有任何异常抛出!)服务交易完成!

任何人都可以提供另一个好的解决方案来回滚测试吗?

测试类上的@Transactional解决方案是执行此操作的标准方法。 Spring Tx没有办法将事务回滚到蓝色之外,所以我建议您仔细研究遇到的问题,而不是发明其他解决方案。

+0

中使用@Rollback(false),那么这可能是迄今为止最好的建议,我会在我的测试方法中深入探讨可能导致此行为的原因。 –

如果不更改默认行为,所有更改都将被回滚。而你没有与事务传播级别= REQUIRES_NEW类/方法,因为它开始独立交易,并且可以提交或与外部事务回滚独立

事务回滚和提交行为

默认情况下,测试交易将在 完成测试后自动回滚;然而,事务提交和回滚 行为可以通过@Commit和@Rollback 注释以声明方式配置。

@Rollback

@Rollback指示是否与测试方法完成后的一个事务性测试方法 事务应该回滚。如果 为真,则事务回滚;否则,交易是 承诺(另请参阅@Commit)。即使未明确声明@Rollback ,Spring TestContext框架中的集成测试 的回滚语义默认为true。

当作为类级注释声明时,@Rollback为测试类 层次结构中的所有测试方法定义 默认回滚语义。当声明为方法级批注时,@Rollback 为特定测试方法定义回滚语义,可能为 覆盖类级别的@Rollback或@Commit语义。

+0

奇怪的是,我没有使用传播新的和默认行为是没有回滚,你有什么建议? –

+0

1)我写了 - '你没有'。 2)即使在测试完成后回调中的回滚成功事务。这是测试的默认行为。如果你需要保存更改,并且不要在测试类或方法 – xyz

docs

默认情况下,测试数据将被自动 完成测试后回滚;然而,事务提交和回滚行为可以通过@Commit和@Rollback注释声明性地配置。

您的评论:

有时测试交易服务交易之前回滚(!即使没有任何 抛出异常)完成!

对我没有意义。你怎么知道txn是否已完成或者是否已经回滚?例外情况对测试无关紧要,因为我引用了上述文档。

+0

在控制台中,我看到日志:回滚事务,并且在我的单元测试方法内调用某些方法之前,有时会记录此事(有时并不总是)。 –

+0

@MahmoudS测试完成后测试数据是否留在数据库中? –

+0

当我在测试类中使用transacional时,测试数据不会遗留,但正如我所说有时测试会无缘无故地回滚并跳过调用某些方法! –