使用@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").

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