服务层是@Transactional

时间:2017-07-07 04:41:19

标签: spring spring-boot junit spring-transactions spring-test

我正在使用 springboot 1.5.2.RELEASE ,我的服务带有

注释
@Service
@Transactional(rollbackFor = Exception.class)

我的单元测试类注释为:

@RunWith(SpringRunner.class)
@SpringBootTest

要求:在测试完成后,通过单元测试方法回滚数据库中所做的更改。

建议的解决方案之一:是在测试类上添加@Transactional注释,我试过但是这个解决方案产生了一些问题,有时候测试事务会被回滚(甚至没有抛出任何例外!)在服务交易完成之前!

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

3 个答案:

答案 0 :(得分:2)

如果未更改默认行为,则将回滚所有更改。并且您没有具有事务传播级别= REQUIRES_NEW的类/方法,因为它启动独立事务并且可以使用外部事务独立提交或回滚

  

事务回滚和提交行为

     

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

     

@Rollback

     

@Rollback表示事务是否为事务测试   测试方法完成后,应该回滚方法。如果   是的,交易被回滚;否则,交易是   承诺(另见@Commit)。用于集成测试的回滚语义   在Spring TestContext Framework中默认为true,即使@Rollback   未明确声明。

     

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

答案 1 :(得分:2)

测试类上带有@Transactional的解决方案是执行此操作的标准方法。 Spring Tx无法突然回滚交易,所以我建议您仔细研究您遇到的问题,而不是发明其他解决方案。

答案 2 :(得分:1)

来自docs

  

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

您的评论:

  

有时候测试事务会被回滚(即使没有   在服务交易完成之前抛出异常!)

对我没有意义。你怎么知道txn是否完成了它是否已经完成了?正如我引用上述文档一样,例外情况对测试无关紧要。