java - 用于 spring 测试的 JUnit 多个事务管理器

标签 java spring jakarta-ee junit

我正在使用 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/

相关文章:

java - Android - 显示文件类型的图像

javax.persistence.OptimisticLockException + org.hibernate.StaleObjectStateException 异常

java - 针对 Java EE 6 API 进行测试

java - 如何在某些 Spring 测试中注入(inject)类的特定实例?

java - 计算两个 long/lat 之间的距离

jakarta-ee - Enterprise Java Bean (EJB) 新手

java - 扩展 Java 内存映射字节缓冲区

java - Callable 而不是 Runnable 所以我不需要捕获

java - JSTL - 比较字符串

java - 在 Spring MVC 中处理更新表单