我正在测试一个具有@Qualified @Autowired
值的类:
// class under test
class C1() {
@Autowired
@Qualified("c1")
DataSource d1;
...
}
位于配置文件中的数据源d1
。
但是当我测试相同的类并且使用测试配置类中的单独的DataSource
时:
// test for class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = testC1Config.class, loader=AnnotationConfigContextLoader.class)
class testC1() {
@Autowired
@Qualified("c1Test")
DataSource d1Test;
...
}
// testC1Config
@Configuration
class 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)}
说他只看到只有限定符c1
的DataSource Bean。曾经尝试使用@Bean(name=c1Test")
,但我得到了相同的结果。
如何让他看到测试包中的c1Test DataSource bean?
答案 0 :(得分:0)
好的,所以我做了一个可行的工作环境。
(在幕后)就我而言,我在test和src包中有2个DataSource,当我在src中测试方法时,他有@Autowired
DataSource,他要求使用符合条件的Bean c1
,但是由于我的c1
中没有testC1Config()
数据源,所以出现了此异常。
因此,我代替自动装配bean并使用具有特定名称的限定符,而是在src config bean中编写了自动连线的 setter ,其中包含相同名称的限定符。
@Autowired
@Qualifier("c1")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
对于我来说,我也正在构造2个jdbcTemplates,因此每次运行测试Bean时,都会在@Test
之前注入所需的数据源并为我做一些事情。如果这样做,则在配置中不需要Bean名称,而在服务@Qualifier("with_same_name_in_src_and_test")
中则不需要。
不知道这是否是解决此问题的好方法,但是....有效。