我正在使用 Spring 3.0.5 和 Junit 4.8.2 是否可以在测试期间使用多个事务管理器?
基本上我正在尝试这样的事情。我需要在测试期间从两个单独的数据库中添加和删除内容。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext-test.xml" })
@TransactionConfiguration(transactionManager = "txMgrA", defaultRollback = true)
@TransactionConfiguration(transactionManager = "txMgrB", defaultRollback = true)
@Transactional
public class SampleTest {
...
}
最佳答案
查看 Spring 5 TransactionalTestExecutionListener
实现,它看起来只支持一个 TransactionManager
per thread,这似乎是一个设计缺陷听众,可能和你在 2011 年遇到的一样:)
但是,目前可以使用 ChainedTransactionManager
解决此问题。如果您有多个事务管理器,您可以在测试上下文中定义另一个事务管理器:
@Configuration
class TestTransactionConfig {
@Bean("testTransactionManager")
public PlatformTransactionManager chainedTransactionManager(
@Qualifier("transactionManager1") PlatformTransactionManager transactionManager1,
@Qualifier("transactionManager2") PlatformTransactionManager transactionManager2
) {
return new ChainedTransactionManager(transactionManager1, transactionManager2);
}
}
现在,您可以使用此事务管理器为测试定义基类:
@RunWith(SpringRunner::class)
@Transactional("testTransactionManager")
class BaseTransactionalTest {
}
对于所有派生类,所有测试方法现在都将包装在两个事务中,最终将由 TransactionalTestExecutionListener
回滚。
关于java - 用于 spring 测试的 JUnit 多个事务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6464327/