我正在测试一个有价值的类@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
提交
取消