SpringBoot单元测试启动报错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot单元测试启动报错相关的知识,希望对你有一定的参考价值。
主要错误信息:java.lang.IllegalStateException: Failed to load ApplicationContextCaused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]...这是什么情况造成的呢,附上主要代码图,请各位帮忙指点下,感激不尽
requestMappingHandlerAdapter这个类没有注入到spring里面,检查这个类是不是添加上了spring注解,或则在xml文件声明了。还有可能就是requestMappingHandlerAdapter这类里面注入里其他类失败了。导致这个类注入失败。 参考技术A 我也遇到这个问题,求解答,而且我的报错最后指向动态数据源配置里@Qualifier 参考技术B 能不 能给一个准确答案阿!SpringBoot - @SpringBootTest加速单元测试的小窍门
Pre
随着代码量的争夺,测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO层的方法,却要启动这个应用。
今天我们继续深入了解一下 稍微高级一点的用法
classes
classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类。
如果不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类加载的 Bean 数量是一样的。
如果你的项目中有很多个 Bean, 特别是有以下几种时:
- 有 CommandLineRunner 的实现类
- 用 @PostConstruct 注解指定了初始化方法的类
这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。
在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:
用法
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={ArtisanServiceImpl.class})
webEnvironment
这个属性的含义是说测试类要不要启动一个 web 环境, 要不要启动一个 Tomcat 容器,可选的值为:
- MOCK, 启动一个模拟的 Servlet 环境, 默认值。
- RANDOM_PORT,启动一个 Tomcat 容器,并监听一个随机的端口号
- DEFINED_PORT,启动一个 Tomcat 容器,并监听配置文件中定义的端口(未定义则默认监听8080)
- NONE,不启动 Tomcat 容器
怎么使用呢? 举个例子 如果你要测试的方法不需要用到 Tomcat 容器,比如:
- 测试 DAO 类的CRUD
- 测试Service 类的业务方法
- 测试工具类的公用方法
- 测试配置文件类是否读取到了正确的值
- …
用法
只需要通过指定 @SpringBootTest(webEnvironment =
SpringBootTest.WebEnvironment.NONE) 即可达到加速的效果。这时测试类启动时就只会初始化 Spring 上下文,不再启动 Tomcat 容器了:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class ArtisanServiceTests {
@Autowired
private IArtisanSerive artisanService;
@Test
public void test() {
// ...
}
}
以上是关于SpringBoot单元测试启动报错的主要内容,如果未能解决你的问题,请参考以下文章