为了账号安全,请及时绑定邮箱和手机立即绑定

带有@Qualifier @Autowired 值的测试类

带有@Qualifier @Autowired 值的测试类

白猪掌柜的 2023-03-09 14:08:02
我正在测试一个有价值的类@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")。


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


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信