【问题标题】:How can I make Spring testcontext framework use multiple data sources?如何让 Spring testcontext 框架使用多个数据源?
【发布时间】:2010-10-19 13:06:56
【问题描述】:

我正在尝试使用 Spring TestContext 框架集成测试我的应用程序。我像往常一样通过扩展AbstractTransactionalJUnit4SpringContextTests 来做到这一点。但是,我的应用程序具有三个不同的数据源(名称如 xDataSource、yDataSource、zdataSource),例如当我尝试运行测试时,AbstractTransactionalJUnit4SpringContextTests 中数据源的自动装配将不起作用,因为它会查找数据源使用 autowire-by-type,但找到了三个,所以它不知道该选择哪一个。

有没有办法让 Spring TestContext Framework 使用三个数据源?如果是这样的话;怎么样?

【问题讨论】:

    标签: java unit-testing spring integration-testing spring-test


    【解决方案1】:

    好的,我想通了。这个问题的答案是双重的。首先,扩展AbstractTransactionalJUnit4SpringContextTests 是行不通的。这是因为它需要一个数据源来创建SimpleJdbcTemplate,以便在测试中使用简单的 JDBC 查询来验证内容。由于我在此测试中没有使用此功能,因此可以将extends AbstractTransactionalJUnit4SpringContextTests 替换为以下配置:

    @ContextConfiguration(locations = "classpath:applicationContext.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    @TestExecutionListeners({
        DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class
    })
    @Transactional
    public class IntegrationTest {
      ...
    }
    

    这些注释的组合提供了与扩展 AbstractTransactionalJUnit4SpringContextTests 相同的设置。

    第二部分是理解,因为我有三个数据源,所以我还需要所有三个数据源,因此被同一个 PlatformTransactionManager 引用。我有分布式事务。这对于DataSourceTransactionManager 是不可能的,所以我不得不使用JtaTransactionManager

    【讨论】:

    • 请注意,您无需指定@TestExecutionListeners - 默认情况下启用这些侦听器。
    【解决方案2】:

    AbstractTransactionalJUnit4SpringContextTests 类自动连接到单个数据源,只是为了方便提供注入的JdbcTemplate 对象。您可以在测试子类中覆盖 AbstractTransactionalJUnit4SpringContextTests 中的 setDataSource(DataSource dataSource) 方法,并指定要使用的数据源,如下所示:

    @Resource(name = "dataSource")
    public void setDataSource(DataSource dataSource) { 
      this.jdbcTemplate = new JdbcTemplate(dataSource); 
    } 
    

    您只需提供 Spring 应用于jdbcTemplate 便利方法的一个数据源的名称。如果扩展AbstractTransactionalJUnit4SpringContextTests 比上面提到的其他方法更方便,那么您可以通过选择一个数据源来强制它工作。

    我在 Spring Jira 票 #SPR-4634 中找到了这些详细信息。

    【讨论】:

      【解决方案3】:

      您可以在 xml 中将其中一个数据源定义为 primary="true",它将被选中。

      如果您需要全部三个,那么您不能依赖自动装配 - 使用 ReflectionTestUtils 在您的测试中手动设置它。

      【讨论】:

      • 我不一定依赖自动装配,但问题是 AbstractTransactionalJUnit4SpringContextTests 自动装配数据源。这用于该类提供的用于在测试中进行简单查询的 simpleJdbcTemplate。如果我只使用注释设置测试,问题就会消失。但是,我希望所有数据源都在同一个事务中运行。
      • 那么,ReflectionTestUtils 应该可以工作了。或许你也应该获取 dao 并设置它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2023-03-03
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      相关资源
      最近更新 更多