我正在尝试将我的应用程序与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 在您的测试中手动设置它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top