2010-10-19 55 views
2

我想集成測試我的應用程序與Spring TestContext框架。像往常一樣,我通過擴展AbstractTransactionalJUnit4SpringContextTests來完成這項工作。但是,我的應用程序有三個不同的數據源(名稱分別爲xDataSource,yDataSource,zdataSource),當我嘗試運行測試時,AbstractTransactionalJUnit4SpringContextTests中的數據源自動裝配將不起作用,因爲它會使用自動裝載查找數據源但是找到三個,所以它不知道選擇哪一個。如何讓Spring testcontext框架使用多個數據源?

有什麼辦法讓Spring TestContext框架使用三個數據源?如果是這樣;怎麼樣?

回答

2

好的,我想通了。這個問題的答案是雙重的。首先,延伸AbstractTransactionalJUnit4SpringContextTests將無法​​正常工作。這是因爲它需要一個數據源來創建SimpleJdbcTemplate用於在測試中驗證具有簡單JDBC查詢的內容。因爲我沒有在這個測試中使用此功能,我可以與collowing配置替代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

+0

請注意,您不需要指定'@ TestExecutionListeners' - 這些偵聽器默認情況下處於啓用狀態。 – axtavt 2010-10-19 15:04:30

0

您可以在xml中將其中一個數據源定義爲primary="true",並且它將被選中。

如果你需要全部三個,那麼你不能依靠自動裝配 - 使用ReflectionTestUtils在你的測試中手動設置它。

+0

這不夠好 - 我需要所有三個。 – mranders 2010-10-19 13:09:33

+0

那麼你不能依靠自動裝配。查看更新 – Bozho 2010-10-19 13:10:11

+0

我不一定依賴自動裝配,但事情是'AbstractTransactionalJUnit4SpringContextTests'自動裝載數據源。這是爲了在測試中進行簡單查詢而提供的simpleJdbcTemplate中使用的。如果我僅使用註釋設置測試,則問題會消失。但是,我希望所有數據源都在同一個事務中運行。 – mranders 2010-10-19 13:31:13

1

AbstractTransactionalJUnit4SpringContextTests類自動裝配到單個數據源,只是爲了方便提供注入的對象。您可以在測試子類中覆蓋從AbstractTransactionalJUnit4SpringContextTestssetDataSource(DataSource dataSource)方法,並指定數據源使用這樣的:

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

你只需要提供一個數據源春的名稱應爲jdbcTemplate方便的方法使用。如果擴展AbstractTransactionalJUnit4SpringContextTests比上面提到的其他方法更方便,那麼您可以通過選擇一個數據源來強制它工作。

我發現這些細節在Spring Jira門票#SPR-4634

相關問題