使用@Qualifier @Autowired值测试类

时间:2019-07-04 13:32:42

标签: java spring spring-boot junit annotations

我正在测试一个具有@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?

1 个答案:

答案 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")中则不需要。

不知道这是否是解决此问题的好方法,但是....有效。