在 Spring Test 里使用 @Transactional(rollbackFor = Exception.class)
注解时,测试方法默认会回滚事务,这是 Spring Test 框架的设计机制,目的是保证测试的独立性和可重复性,避免测试数据对数据库造成持久化影响。下面详细解释原因和相关机制:
原因
Spring Test 框架会在测试方法执行前开启一个事务,在测试方法执行完毕后,不管测试是否成功,默认都会回滚这个事务。这样做能确保每个测试方法运行前后数据库状态保持一致,不同测试之间不会因为数据残留而相互影响。
相关机制
@Transactional
注解:该注解用于声明方法需要在事务环境中执行。在 Spring Test 里,添加此注解后,Spring 会为测试方法创建一个事务上下文。TestTransaction
类:Spring Test 通过TestTransaction
类管理测试事务,默认配置下,测试方法结束时TestTransaction
会调用rollback()
方法回滚事务。
不回滚的解决办法
若你希望测试方法中的事务不回滚,可以通过以下几种方式实现:
1. 使用 @Rollback(false)
注解
@Rollback
注解能控制测试事务是否回滚,将其值设为 false
可让事务提交。
package marriage.test.service;
// ... 已有代码 ...
@Slf4j
public class SeekerMemberCardServiceTest extends BaseTest {
// ... 已有代码 ...
@Test
@Transactional(rollbackFor = Exception.class)
@Rollback(false) // 设置事务不回滚
public void addSeekerMemberCard() {
// 测试逻辑
// ... 已有代码 ...
}
}
2. 编程式控制事务提交
在测试方法中使用 TestTransaction
类手动控制事务提交。
package marriage.test.service;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.transaction.TestTransaction;
// ... 已有代码 ...
@Slf4j
public class SeekerMemberCardServiceTest extends BaseTest {
// ... 已有代码 ...
@Test
@Transactional(rollbackFor = Exception.class)
public void addSeekerMemberCard() {
// 测试逻辑
// ... 已有代码 ...
// 手动提交事务
TestTransaction.flagForCommit();
TestTransaction.end();
}
}
通过上述方法,你就能控制测试事务是否回滚了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END