如何使Spring testcontext框架使用多个数据源?

时间:2010-10-19 13:06:57

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

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

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

3 个答案:

答案 0 :(得分:2)

好的,我明白了。这个问题的答案是双重的。首先,扩展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

答案 1 :(得分:1)

AbstractTransactionalJUnit4SpringContextTests类仅自动装配到单个数据源,以便于提供注入的JdbcTemplate对象。您可以覆盖测试子类中setDataSource(DataSource dataSource)的{​​{1}}方法,并指定要使用的数据源:

AbstractTransactionalJUnit4SpringContextTests

您只需提供Spring应该用于@Resource(name = "dataSource") public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } 便捷方法的一个数据源的名称。如果扩展jdbcTemplate比上面提到的其他方法更方便,那么只需选择一个数据源就可以强制它工作。

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

答案 2 :(得分:0)

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

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