spring 多租户设置中的单元测试回滚

gajydyqb  于 2023-05-27  发布在  Spring
关注(0)|答案(1)|浏览(151)

在将Sping Boot 应用程序转换为基于模式的多租户设置时,我再次遇到了一个让原始单元测试工作的问题。在我的设置中,有两个自定义的LocalContainerEntityManagerFactoryBean示例(其中一个使用MultiTenantConnectionProvider和@Primary注解)和两个自定义的JpaTransactionManager示例(其中一个使用@Primary注解)。
原始单元测试在类级别上配备了@SpringBootTest@AutoConfigureTestDatabase@Sql@Transactional注解。
问题是每个单元测试方法之后的回滚不再按预期工作。根据日志,似乎启动了回滚,但是从@SQL注解执行的sql代码导致了重复的键异常-因此表明回滚没有发生。
让测试重新工作的一个变通方法是使用@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)。然而,如果我真的不能弄清楚发生了什么,这只是一个导致测试执行时间大量增加的解决方案。
有人对此有意见吗?我猜这与TransactionalTestExecutionListener有关,但几个小时后我仍然找不到问题,不幸的是。

zf9nrax1

zf9nrax11#

我现在的解决方法是:

@Autowired
    private DataSource dataSource;

    @Autowired
    private JpaTransactionManager transactionManager;

    @BeforeAll
    public void init() {
        transactionManager.setDataSource(dataSource);
    }

此外,我仔细检查了事务回滚在生产代码中的工作情况。我可以接受这个解决方案,但我仍然很好奇为什么需要这个解决方案。JpaTransactionManager使用它的afterPropertiesSet()来设置从EntityManager接收的DataSource。在多租户设置中,这个DataSource在设计上是null(因为它应该根据请求的租户进行解析)。为了测试,似乎需要来自事务管理器的非空DataSource引用(而在生产代码中似乎不需要)。

相关问题