所遇问题描述
- 在工作中,我在test目录下定义了自己的config配置类,然后写好了service的测试逻辑,在启动时报了报NoSuchBeanDefinitionException: No qualifying bean异常,根据异常我找到需要被注入的bean并且bean name和我配置中需要注入的一致,但是为什么还是会报NoSuchBeanDefinitionException异常呢?
- 以下将描述细节和展示部分关键代码(以下代码仿造了工作场景,不必在意细节)
(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下定义的配置类不起作用。
解决方案
- 更改测试目录下的Config配置类的名称,让它不要与main下的同包同名
- 修改test目录下的包路径,可以增加一层test包,比如com.nestorbian.jackson.demo.test.config
关于单元测试的注意点
- test下的定义的bean无法被main包下的类进行注入。
- test下的测试类优先调用test下resources的配置文件,找不到去找main下的配置文件。