我正在尝试将我的应用程序与Spring TestContext框架集成测试。我像往常一样通过扩展AbstractTransactionalJUnit4SpringContextTests
来做到这一点。但是,我的应用程序有三个不同的数据源(名称为xDataSource,yDataSource,zdataSource),当我尝试运行测试时,AbstractTransactionalJUnit4SpringContextTests
中的数据源自动装配将无法工作,因为它会查找数据源具有autowire-by-type,但找到三个,因此它不知道选择哪一个。
有没有办法让Spring TestContext Framework使用三个数据源?如果是这样;如何?
答案 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
在您的测试中手动设置它。