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
相关产品推荐
相关产品推荐

