在将Sping Boot 应用程序转换为基于模式的多租户设置时,我再次遇到了一个让原始单元测试工作的问题。在我的设置中,有两个自定义的LocalContainerEntityManagerFactoryBean
示例(其中一个使用MultiTenantConnectionProvider和@Primary
注解)和两个自定义的JpaTransactionManager
示例(其中一个使用@Primary
注解)。
原始单元测试在类级别上配备了@SpringBootTest
,@AutoConfigureTestDatabase
,@Sql
和@Transactional
注解。
问题是每个单元测试方法之后的回滚不再按预期工作。根据日志,似乎启动了回滚,但是从@SQL
注解执行的sql代码导致了重复的键异常-因此表明回滚没有发生。
让测试重新工作的一个变通方法是使用@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
。然而,如果我真的不能弄清楚发生了什么,这只是一个导致测试执行时间大量增加的解决方案。
有人对此有意见吗?我猜这与TransactionalTestExecutionListener
有关,但几个小时后我仍然找不到问题,不幸的是。
1条答案
按热度按时间zf9nrax11#
我现在的解决方法是:
此外,我仔细检查了事务回滚在生产代码中的工作情况。我可以接受这个解决方案,但我仍然很好奇为什么需要这个解决方案。
JpaTransactionManager
使用它的afterPropertiesSet()
来设置从EntityManager
接收的DataSource
。在多租户设置中,这个DataSource
在设计上是null
(因为它应该根据请求的租户进行解析)。为了测试,似乎需要来自事务管理器的非空DataSource
引用(而在生产代码中似乎不需要)。