java Sping Boot 测试不回滚事务(MS SQL Server,Spring启动2.7.5)

ruarlubt  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(148)

我正在为具有多个数据源的项目编写集成测试,并希望测试存储库和服务层。问题是@Transactional注解不起作用,并且测试期间插入的数据是持久的。
这是一个简单的IT。我需要使用@SpringBootTest而不是@DataJpaTest,因为在一个bean中配置了多个数据源,该bean负责将正确的数据源分配给正确的存储库。

@SpringBootTest(classes = { MyApp.class, TestSecurityConfiguration.class })
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("database-test")
@Transactional
@Rollback
public class MyIT {

    @Autowired
    ChannelRepository channelRepository;

    @Test
    public void testChannels() {

        Channel testChannel1 = new Channel();
        testChannel1.setDescription("Test Channel 1");
        channelRepository.save(testChannel1);

        Channel testChannel2 = new Channel();
        testChannel2.setDescription("Test Channel 2");
        channelRepository.save(testChannel2);

        Channel channel = channelRepository.findById(1).get();
        assertThat(channel).isNotNull();
    }

}

在application.yml中配置的方言是“org.hibernate.dialect.SQLServer2012Dialect”,数据库是我们的测试数据库,它运行在专用服务器上,而不是嵌入式数据库。
插入数据时不回滚。

ldxq2e6h

ldxq2e6h1#

使用以下命令查看JpaTransactionManager日志后:

logging:
  level:
    sql: DEBUG
    ROOT: DEBUG
    org.springframework.orm.jpa: DEBUG
    org.springframework.transaction: DEBUG

我看到每个.保存()调用都有一个新的内部事务。我尝试通过将值传递给@Transactional注解来手动指定事务管理器,现在它可以工作了。看起来数据源bean的选取不完全正确。我的想法是基于本文,其中ChainedTransactionManager用于多个数据源https://medium.com/preplaced/distributed-transaction-management-for-multiple-databases-with-springboot-jpa-and-hibernate-cde4e1b298e4

相关问题