我正在使用 springboot 1.5.2.RELEASE ,我的服务类带有
注释@Service
@Transactional(rollbackFor = Exception.class)
我的单元测试类注释为:
@RunWith(SpringRunner.class)
@SpringBootTest
要求:在测试完成后,通过单元测试方法回滚数据库中所做的更改。
建议的解决方案之一:是在测试类上添加@Transactional
注释,我试过但是这个解决方案产生了一些问题,有时候测试事务会被回滚(甚至没有抛出任何例外!)在服务交易完成之前!
任何人都可以为回滚测试提供另一个好的解决方案吗?
答案 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是否完成了它是否已经完成了?正如我引用上述文档一样,例外情况对测试无关紧要。