使用@Qualifier @Autowired 值测试 class
Test class with @Qualifier @Autowired value
我正在测试具有 @Qualified @Autowired
值的 class:
// class under test
class C1() {
@Autowired
@Qualified("c1")
DataSource d1;
...
}
DataSource d1
位于配置文件中。
但是当我测试相同的 class 并且我使用单独的 DataSource
时,它在测试配置中 class:
// 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)}
说他只看到只有 Qualifier c1
的 DataSource Bean。尝试使用 @Bean(name=c1Test")
但我得到相同的结果..
如何让他看到测试包中的 c1Test DataSource bean?
好的,所以我制作了一个可以使用的 work-arround。
(幕后)对于我的情况,我在测试和 src 包中有 2 个数据源,当我在 src 中测试方法时,他有 @Autowired
数据源,他要求使用 bean符合 c1
,但由于我的 testC1Config()
中没有 c1
DataSource,所以我遇到了这个异常。
因此,我在 src 配置 bean 中编写了带有包含相同名称的限定符的自动装配 setter,而不是自动装配一个 bean 并使用具有特定名称的限定符。
@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")
.
不知道这是否是解决此问题的好方法,但是....它有效。
我正在测试具有 @Qualified @Autowired
值的 class:
// class under test
class C1() {
@Autowired
@Qualified("c1")
DataSource d1;
...
}
DataSource d1
位于配置文件中。
但是当我测试相同的 class 并且我使用单独的 DataSource
时,它在测试配置中 class:
// 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)}
说他只看到只有 Qualifier c1
的 DataSource Bean。尝试使用 @Bean(name=c1Test")
但我得到相同的结果..
如何让他看到测试包中的 c1Test DataSource bean?
好的,所以我制作了一个可以使用的 work-arround。
(幕后)对于我的情况,我在测试和 src 包中有 2 个数据源,当我在 src 中测试方法时,他有 @Autowired
数据源,他要求使用 bean符合 c1
,但由于我的 testC1Config()
中没有 c1
DataSource,所以我遇到了这个异常。
因此,我在 src 配置 bean 中编写了带有包含相同名称的限定符的自动装配 setter,而不是自动装配一个 bean 并使用具有特定名称的限定符。
@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")
.
不知道这是否是解决此问题的好方法,但是....它有效。