2

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

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

4

3 回答 3

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。我有分布式事务。这对于 a 是不可能的DataSourceTransactionManager,所以我不得不使用 a JtaTransactionManager

于 2010-10-19T14:59:33.013 回答
1

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

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

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

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

于 2014-02-17T16:49:00.143 回答
0

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

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

于 2010-10-19T13:08:27.897 回答