我正在測試一個有價值的類@Qualified @Autowired:// class under testclass C1() { @Autowired @Qualified("c1") DataSource d1; ...}DataSourced1位于配置文件中。但是當我測試同一個類并且我使用單獨的DataSource測試配置類時:// test for class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = testC1Config.class, loader=AnnotationConfigContextLoader.class)class testC1() { @Autowired @Qualified("c1Test") DataSource d1Test; ...}// testC1Config@Configurationclass testC1Config() { @Bean @Qualified("c1Test") DataSource c1Test() { ... }}我得到這個例外:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=c1)}說他只看到只有 Qualifier 的 DataSource Bean c1。嘗試使用@Bean(name=c1Test")但我得到相同的結果..我如何讓他看到測試包中的 c1Test DataSource bean?
1 回答

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
好的,所以我做了一個可行的解決方法。
(在幕后)對于我的情況,我在測試和 src 包中有 2 個數據源,當我在 src 中測試方法時,他有@Autowired數據源并且他要求使用符合條件的 bean c1,但是因為我沒有c1數據源我testC1Config()得到了這個例外。
因此,我在 src 配置 bean 中編寫了帶有包含相同名稱的限定符的自動裝配setter ,而不是自動裝配一個 bean 并使用具有特定名稱的限定符。
@Autowired
@Qualifier("c1")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
對于我的情況,我也在構建 2 個 jdbcTemplates,這樣每當我運行測試 Bean 時都會注入我需要的 DataSource 并在之前為我做一些事情@Test。如果這樣做,配置中不需要 bean 名稱,但在服務中@Qualifier("with_same_name_in_src_and_test")。
不知道這是否是解決此問題的好方法,但是......它有效。
添加回答
舉報
0/150
提交
取消