如何使Spring TestContext框架使用多个数据源?
-
09-10-2019 - |
题
我正在尝试将我的应用程序与Spring TestContext框架进行集成。我通过扩展来做到这一点 AbstractTransactionalJUnit4SpringContextTests
, , 照常。但是,我的应用程序具有三种不同的数据源(诸如Xdatasource,Ydatasource,Zdatasource之类的名称),当我尝试运行测试时,Så是在IN中进行测试的三个不同的数据源。 AbstractTransactionalJUnit4SpringContextTests
不起作用,因为它寻找具有逐型自动式的数据源,但要找到三个,因此它不知道该选择哪一个。
有什么方法可以获取Spring TestContext框架使用三个数据源?如果是这样;如何?
解决方案
好的,我发现了。这个问题的答案是双重的。首先,扩展 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
.
其他提示
这 AbstractTransactionalJUnit4SpringContextTests
类自动到单个数据源,仅允许提供注射的便利性 JdbcTemplate
目的。你可以覆盖 setDataSource(DataSource dataSource)
方法 AbstractTransactionalJUnit4SpringContextTests
在您的测试子类中,并指定要使用的数据源:
@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
您只需要提供一个数据源弹簧的名称 jdbcTemplate
便利方法。如果扩展 AbstractTransactionalJUnit4SpringContextTests
比上面提到的其他方法更方便,然后您可以通过选择其中一种数据源来强迫它起作用。
我在Spring Jira票中找到了这些细节 #SPR-4634.
您可以将其中一个数据源定义为 primary="true"
在您的XML中,它将被选中。
如果您需要全部threem,那么您将无法依靠自动化 - 使用 ReflectionTestUtils
在您的测试中手动设置它。