使用Spring Boot进行单元测试时,发现使用@Autowired注解的类无法自动注入,当使用这个类的实例的时候,报出NullPointerException,即空指针异常。

Spring Boot中的单元测试

先简单说一下Spring Boot中的单元测试。

要在Spring Boot中使用单元测试是很简单的,Spring Boot提供了spring-boot-starter-test的依赖,即JUnit的相关依赖。

  1. 在pom.xml文件中引入依赖:
org.springframework.boot spring-boot-starter-test
  1. 单元测试的语法也很简单,使用@Test注解在方法上或在类上就可以进行简单的单元测试了。
public class aquanTest { @Test public void testOne () { System.out.println("我是一个简单测试。"); }}

自动注入servicei或dao报空指针异常的原因

说回在JUnit单元测试类中自动注入servicei或dao为什么会报空指针异常,报错的原因很明显是 @Autowired 自动注入注解没有成功将类的实例注入。

我们知道,在Spring中,类的实例是交给容器管理的,而在测试类中,容器因为没有相应的上下文环境,是没有办法找到相应的类并进行相应的初始化/实例化操作,因此也就没有在测试类中成功注入类的实例,在试图使用类的实例的情况下也就会报空指针异常的错误。

如何注入servicei或dao

根据上面的分析,如果要注入servicei或dao的话,我们需要给容器构建一个上下文环境,这里具体是Spring Boot的运行环境。

我们可以通过在测试类上添加两个注解来实现构建上下文环境的效果。

@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)public class aquanTest {  }

我们从注解的命名上就可以看出其功能,但这里还是简单介绍一下。

@RunWith注解

@RunWith注解是类级别的注解, 它提供了一种更改测试运行程序的默认行为的机制。简单理解,@RunWith注解就是一个运行器,其接受一个类的签名来指定是使用什么类、在什么环境下运行。需要注意的是,该注解的参数必须是Runner类的子类,JUnit本身有提供几个Runner,默认值为JUnit4,一个常见的替代方法是参数化类。

当使用@RunWith注解对JUnit测试进行注解时,将对测试的生命周期和测试的运行方式进行一些更改。

比如@RunWith(JUnit4.class)就是指用JUnit4来运行。

比如@RunWith(SpringJUnit4ClassRunner.class)就是让测试运行于Spring测试环境。

比如@RunWith(Suite.class)的话就是一套测试集合。

比如@RunWith(SpringJUnit4ClassRunner.class)使用了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文。一般情况下想创建spring容器的话,需要通过web.xml配置classloder,但如果注解了@RunWith注解的话,就可以直接使用spring容器,直接使用@Test注解,不用启动spring容器。

在上面的代码中,使用了@RunWith(SpringRunner.class),实际上,SpringRunner类就是继承于Spring的SpringJUnit4ClassRunner类。

@SpringBootTest注解

@SpringBootTest注解是一个Spring Boot提供的注解,通过这个注解可以使JUnit单元测试跑在Spring Boot的运行环境中。

我们可以通过classes参数来指定Spring Boot的启动类。

完整的示例例

最后我们来看一个完整的、在测试类中注入service的示例。

@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)public class aquanTest { @Autowried TestService testService; @Test public void testOne () { testService.meow(); }}

在线快速制作H5页面并提供页面管理和页面编辑的开源平台

新型开源postwoman接口调试工具VS传统经典postman和crapAPI工具

java报错空指针异常_分析使用Spring Boot进行单元测试时,报出空指针异常相关推荐

  1. 【Java报错】java.lang.ClassCastException: xxxClass cannot be cast to java.lang.Comparable 问题重现+解决

    报错信息:java.lang.ClassCastException: xxx cannot be cast to java.lang.Comparable 1. 问题重现 以下为伪代码: // 获取的 ...

  2. java报错MalformedURLException: unknown protocol: c

    java报错:MalformedURLException: unknown protocol: c 1. 报错情况: 部分代码: //打开图片path="C:/Users/MyUser/im ...

  3. java报错-找不到或无法加载主类(Error: Could not find or load main class)

    此文首发于我的个人博客:java报错-找不到或无法加载主类(Error Could not find or load main class) - zhang0peter的个人博客 比如说test.ja ...

  4. SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析

    SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析 所在项目客户的一家工厂上线已经超过半年,其业务部门提出一个使用了半年的RF枪程序,突然不能使用了.程序直接Dump ...

  5. mysql注入原理_Mysql报错注入原理分析

    报错类型Duplicate entry报错:多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息. Xpath报错:从mysql5.1.5开始提供两个XML查询和修改的函数,语法错误导 ...

  6. JAVA类运行时,报错“Error occurred during initialization of boot layer”

    JAVA类运行时,报错"Error occurred during initialization of boot layer" 网上查原因是由于JDK9及以上版本引入了模块,所以在 ...

  7. springboot启动突然报错Could not resolve placeholder 'spring.datasource.driver-class-name'

    之前好好的项目,今天启动突然报错Could not resolve placeholder 'spring.datasource.driver-class-name' 按照网友的方法,添加了 @Pro ...

  8. java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板

    点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...

  9. 成功解决java报错:Implicit super constructor XX() is undefined. Must explicitly invoke another constructor.

    今天写一个有关继承的代码时遇到了这个问题: Implicit super constructor XX() is undefined. Must explicitly invoke another c ...

最新文章

  1. SAP MM 向交货单的存在不阻止PO被删除
  2. MySQL中如何通过修改表实现约束的添加与删除
  3. echarts柱状图间距调整_Excel每天学个统计图(1)-折线柱状图
  4. 洛谷 - P2944 [USACO09MAR]Earthquake Damage 2 G(最小割)
  5. P2922-[USACO08DEC]秘密消息Secret Message【Trie,字符串】
  6. java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...
  7. linux 状态码的意义,HTTP状态码是什么?常见的状态码描述都有什么?
  8. android麦克风监听动画效果,微信小程序实现录音时的麦克风动画效果实例
  9. javascript 西瓜一期 09 字符与编码的对应关系 理解
  10. C++_逻辑运算符_非_与_或---C++语言工作笔记015
  11. How——如何学习Win32汇编
  12. PHP中文分词扩展 SCWS
  13. httpd在嵌入式中应用
  14. html实现自动图片轮播,图片轮播的实现(html__js)
  15. node学习 express + mysql + ejs实现注册登录
  16. Xilinx GTX/GTH时钟篇(7系列)
  17. activity 所需jiar包
  18. 安卓开发本地视频播放器——扫描本地视频文件显示在gridview上,然后点击播放。
  19. oracle中dbms_DBMS中的关系演算
  20. 行为招聘法:你会被谷歌录取吗

热门文章

  1. python程序文件的扩展名称是什么_python程序文件的扩展名称是什么_Python教程,python,扩展名...
  2. ASN.1编解码与编程
  3. EPTP 和 EPT 分页结构条目的格式
  4. Linux内存管理:反向映射机制(匿名页,文件页和ksm页)
  5. python之数字操作
  6. python全局变量修改_python中全局变量的修改
  7. SpringCloud微服务权限控制(一)概述
  8. for vue 一行2列_前端开发面试问什么?vue面试中经常问到的问题?用vue想拿20k,面试题要这样答!...
  9. ShadeGraph教程之节点详解2:Channel Nodes
  10. java ee 值范围_javaEE四大作用域(共享域)