You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit5集成测试中@Transactional未生效的解决方案咨询

解决方案

直接在测试类中通过@Autowired注入DoAnythingHandler Bean,而非手动实例化,这样Spring的事务代理就能正常生效:

修改后的测试类代码

@SpringBootTest
public class InsertAnythingIntegrationTest {

  @Autowired
  private DoAnythingHandler handler;

  @Autowired
  private AnythingRepository anythingRepository;
  
  // 移除手动实例化Handler的@BeforeEach代码

  @Test
  void handle_shouldAddEntry_givenValidValue() {
      // 注意:Handler中实际方法名为insertOrUpdateSomething,需对应修正调用
      handler.insertOrUpdateSomething(new Entity(x,y,z));
      assertThat(anythingRepository.findAll()).hasSize(1);
  }
}

关键说明

  • Spring的@Transactional注解依赖Spring容器管理的代理Bean生效,手动new出来的对象不属于Spring代理链,因此事务逻辑不会触发。直接注入Bean后,调用方法时会通过代理类自动开启事务。
  • DoAnythingHandler的insertOrUpdateSomething方法使用默认的REQUIRED事务传播级别,方法执行完成后事务会自动提交,测试代码可以直接查询到数据库中的数据,无需给测试类添加@Transactional(测试类加该注解会默认回滚事务,导致断言失败)。
  • 额外修正:原Handler类的构造方法存在语法错误,应改为public DoAnythingHandler() { }(去掉多余的括号)。

内容的提问来源于stack exchange,提问作者Andréw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:15:40