【问题标题】:Test class with @Qualifier @Autowired value带有@Qualifier @Autowired 值的测试类
【发布时间】:2019-11-15 06:21:14
【问题描述】:

我正在测试一个具有@Qualified @Autowired 值的类:

// class under test
class C1() {

    @Autowired
    @Qualified("c1")
    DataSource d1;
    ...
}

DataSource 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?

【问题讨论】:

  • @user7294900 我的错,我的 testConfig 文件中有 @Qualifier 用于此方法。它仍然说他只看到c1
  • 在 bean 定义中尝试 @Bean(name = "c1Test") 而不是 @Qualified("c1Test")

标签: java spring spring-boot junit annotations


【解决方案1】:

好的,所以我做了一个可行的工作区。

(幕后)对于我的情况,我在 test 和 src 包中有 2 个 DataSource,当我在 src 中测试方法时,他有 @Autowired DataSource 并且他要求使用符合 @987654322 的 bean @,但由于我的 testC1Config() 中没有 c1 DataSource,所以我遇到了这个异常。

因此,不是自动装配一个 bean 并使用具有特定名称的限定符,而是编写了自动装配的 setter,其限定符在 src 配置 bean 中包含相同的名称。

    @Autowired
    @Qualifier("c1")
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

对于我的情况,我也在构建 2 个 jdbcTemplate,这样每当我运行测试 Bean 时,都会注入我需要的 DataSource 并在 @Test 之前为我做一些事情。如果这样做,配置中不需要 bean 名称,但服务中需要 @Qualifier("with_same_name_in_src_and_test")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2017-04-11
    • 2020-09-01
    • 2016-12-05
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多