工作游记:预先定义了所需bean,启动spring boot单元测试,报NoSuchBeanDefinitionException: No qualifying bean异常

所遇问题描述

  1. 在工作中,我在test目录下定义了自己的config配置类,然后写好了service的测试逻辑,在启动时报了报NoSuchBeanDefinitionException: No qualifying bean异常,根据异常我找到需要被注入的bean并且bean name和我配置中需要注入的一致,但是为什么还是会报NoSuchBeanDefinitionException异常呢?
  2. 以下将描述细节和展示部分关键代码(以下代码仿造了工作场景,不必在意细节)
    (1)在mian目录下定义了一个Config配置类里面声明了一个bean name 为paramBean的bean,具体细节如下:
    在这里插入图片描述
package com.nestorbian.jackson.demo.config;

import com.nestorbian.jackson.demo.query.Param;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {

    @Bean
    public Param paramBean() {
        return new Param();
    }

}

(2)在test测试目录下定义了Config配置类,以及Service测试类
在这里插入图片描述

package com.nestorbian.jackson.demo.config;

import com.nestorbian.jackson.demo.query.Param;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {

    @Bean
    public Param paramTestBean(@Qualifier("paramBean") Param paramBean) {
        return paramBean;
    }

}
package com.nestorbian.jackson.demo.config;


import com.nestorbian.jackson.demo.JacksonFullConfigApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = JacksonFullConfigApplication.class)
public class ServiceTest {

    @Test
    public void serviceTest() {
       // service测试逻辑代码
    }

}

分析

细心的话会发现以上两个配置类除了所属目录不一样,包路径和类名都是一样的。由此可见问题的所在,在spring中进行单元测试时,在test目录下的包路径和类名都和main目录下的一样,不会报错,会使用test目录下定义的类,在main下定义com.nestorbian.jackson.demo.config.Config配置类,test下也配置了com.nestorbian.jackson.demo.config.Config,在这个Config类里注入main下com.nestorbian.jackson.demo.config.Config配置类的paramBean,会报NoSuchBeanDefinitionException异常,是由于默认会用test下的com.nestorbian.jackson.demo.config.Config覆盖掉main下的导致,main下定义的配置类不起作用。

解决方案

  1. 更改测试目录下的Config配置类的名称,让它不要与main下的同包同名
  2. 修改test目录下的包路径,可以增加一层test包,比如com.nestorbian.jackson.demo.test.config

关于单元测试的注意点

  1. test下的定义的bean无法被main包下的类进行注入。
  2. test下的测试类优先调用test下resources的配置文件,找不到去找main下的配置文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值