猿问

带有@Qualifier @Autowired 值的测试类

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


// class under test

class 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

@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 的 DataSource Bean c1。尝试使用@Bean(name=c1Test")但我得到相同的结果..


我如何让他看到测试包中的 c1Test DataSource bean?


白猪掌柜的
浏览 76回答 1
1回答

神不在的星期二

好的,所以我做了一个可行的解决方法。(在幕后)对于我的情况,我在测试和 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")。不知道这是否是解决此问题的好方法,但是......它有效。
随时随地看视频慕课网APP

相关分类

Java
我要回答