Java 如何使SpringTestContext框架使用多个数据源?

Java 如何使SpringTestContext框架使用多个数据源?,java,unit-testing,spring,integration-testing,spring-test,Java,Unit Testing,Spring,Integration Testing,Spring Test,我正在尝试将我的应用程序与SpringTestContext框架集成测试。我像往常一样通过扩展AbstractTransactionalJUnit4SpringContextTests来实现这一点。但是,我的应用程序有三个不同的数据源(名称为xDataSource、yDataSource、zdataSource),当我尝试运行测试时,AbstractTransactionalJUnit4SpringContextTests中的数据源自动连接将不起作用,因为它按类型查找具有autowire的数据源

我正在尝试将我的应用程序与SpringTestContext框架集成测试。我像往常一样通过扩展
AbstractTransactionalJUnit4SpringContextTests
来实现这一点。但是,我的应用程序有三个不同的数据源(名称为xDataSource、yDataSource、zdataSource),当我尝试运行测试时,
AbstractTransactionalJUnit4SpringContextTests
中的数据源自动连接将不起作用,因为它按类型查找具有autowire的数据源,但找到三个,所以它不知道选择哪一个


有没有办法让SpringTestContext框架使用三个数据源?若有,;如何定义?

您可以在xml中将其中一个数据源定义为
primary=“true”
,并将其选中


如果您需要所有三个M,那么您不能依靠自动布线-在测试中使用
ReflectionTestUtils
手动设置它。

好的,我找到了。这个问题的答案是双重的。首先,扩展
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
相同的设置


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

抽象事务JUnit4S普林gContextTests
类自动连接到单个数据源,只为了方便提供注入的
JdbcTemplate
对象。您可以在测试子类中重写
AbstractTransactionalJUnit4SpringContextTests
中的
setDataSource(DataSource DataSource)
方法,并指定要使用的数据源,如下所示:

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


我在Spring Jira罚单中找到了这些细节。

我不一定依赖自动连线,但问题是
AbstractTransactionalJUnit4S普林gContextTests
自动连线数据源。这是在simpleJdbcTemplate中使用的,该类提供simpleJdbcTemplate用于在测试中执行简单查询。如果我只使用注释设置测试,问题就会消失。但是,我希望所有数据源都在同一事务中运行。也许您还应该获取dao并将其设置在那里。请注意,您不需要指定
@TestExecutionListeners
——这些侦听器在默认情况下处于启用状态。