SpringBootTest默认回滚事务的问题

在 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
喜欢就支持一下吧
点赞0 分享