Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在服务层为@Transactional时回滚单元测试_Spring_Spring Boot_Junit_Spring Transactions_Spring Test - Fatal编程技术网

Spring 如何在服务层为@Transactional时回滚单元测试

Spring 如何在服务层为@Transactional时回滚单元测试,spring,spring-boot,junit,spring-transactions,spring-test,Spring,Spring Boot,Junit,Spring Transactions,Spring Test,我使用的是Spring Boot 1.5.2.RELEASE,我的服务类用 @Service @Transactional(rollbackFor = Exception.class) 我的单元测试类带有以下注释: @RunWith(SpringRunner.class) @SpringBootTest 我希望在测试完成后,通过单元测试方法回滚在数据库中所做的更改 建议的解决方案之一是在测试类上添加@Transactional注释,我尝试过,但该解决方案产生了一些问题,即有时在服务事务完成之

我使用的是Spring Boot 1.5.2.RELEASE,我的服务类用

@Service
@Transactional(rollbackFor = Exception.class)
我的单元测试类带有以下注释:

@RunWith(SpringRunner.class)
@SpringBootTest
我希望在测试完成后,通过单元测试方法回滚在数据库中所做的更改

建议的解决方案之一是在测试类上添加
@Transactional
注释,我尝试过,但该解决方案产生了一些问题,即有时在服务事务完成之前回滚测试事务(即使没有抛出异常!)


是否有其他好的回滚测试解决方案?

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

事务回滚和提交行为

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

@回滚

@Rollback指示是否为事务测试创建事务 方法应在测试方法完成后回滚。如果 如果为true,则事务将回滚;否则,事务将被删除 已提交(另请参见@Commit)。集成测试的回滚语义 在SpringTestContext框架中,即使@Rollback也默认为true 未显式声明

当声明为类级注释时,@Rollback定义 测试类中所有测试方法的默认回滚语义 等级制度当声明为方法级注释时,@Rollback 定义特定测试方法的回滚语义,可能是 重写类级别@Rollback或@Commit语义


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

事务回滚和提交行为

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

@回滚

@Rollback指示是否为事务测试创建事务 方法应在测试方法完成后回滚。如果 如果为true,则事务将回滚;否则,事务将被删除 已提交(另请参见@Commit)。集成测试的回滚语义 在SpringTestContext框架中,即使@Rollback也默认为true 未显式声明

当声明为类级注释时,@Rollback定义 测试类中所有测试方法的默认回滚语义 等级制度当声明为方法级注释时,@Rollback 定义特定测试方法的回滚语义,可能是 重写类级别@Rollback或@Commit语义


在测试类上使用
@Transactional
的解决方案是实现这一点的标准方法。Spring Tx不可能突然回滚事务,因此我建议您仔细研究遇到的问题,而不是发明其他解决方案。

在测试类上使用
@Transactional
的解决方案是实现这一点的标准方法。Spring Tx不可能突然回滚事务,因此我建议您仔细研究遇到的问题,而不是发明其他解决方案。

来自:

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

您的评论:

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

对我来说没有意义。如果txn被回滚,您如何知道它是否已完成?例外情况对于测试来说并不重要,正如我引用了上面的文档。

来自:

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

您的评论:

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


对我来说没有意义。如果txn被回滚,您如何知道它是否已完成?异常对于测试来说并不重要,正如我在上面引用的文档所述。

奇怪的是,我没有使用新的传播,默认行为是不回滚,你有什么建议吗?1)我写了-“而且你没有”。2) 即使调用成功,测试完成后回滚中的事务也是如此。这是测试的默认行为。如果您需要保存更改,并且不在测试类或MethodWord中使用@rollback(false)进行回滚,那么我没有使用新的传播,默认行为是no rollback,您有什么建议吗?1)我写了-'并且您没有'。2) 即使调用成功,测试完成后回滚中的事务也是如此。这是测试的默认行为。如果您需要更改保存,并且不执行回滚,请在控制台的测试类或方法中使用@rollback(false),我会看到日志:rollback事务,并且有时(不总是)会记录该事务在我的单元测试方法中调用某些方法之前。@MahmoudS是测试完成后留在DB中的测试数据吗?当我在测试类中使用transacional时,测试数据是n