当前位置: 首页 > news >正文

单元测试-java.lang.NullPointerException

报错信息

java.lang.NullPointerException
空指针异常
空对象引用

来源

Controller层进行单元测试,解决完Spring上下文报错后继续报错。

解决

在测试方法执行前要为字段完成对象的注入,否则就报空指针异常。
在这里插入图片描述

测试例子

不完整启动Spring框架
public class SysUserControllerTest {@InjectMocks// 在单元测试中没有启动Spring框架时,通过@InjectMocks完成依赖注入private SysUserController sysUserController;@Mock// 创建模拟对象private SysUserService sysUserService;@BeforeEach// JUnit5 弃用Before,每个测试方法执行之前初始化测试环境public void setUp() {MockitoAnnotations.openMocks(this);// 初始化被@Mock、@Spy、@Captor 和 @InjectMocks 注解的字段}@Testpublic void testSelectOne() throws Exception {// 准备测试数据Serializable id = 1;SysUser sysUser = new SysUser();sysUser.setId(1L);sysUser.setUserName("admain");// 设置mock对象行为// 设置sysUserService的 getById 方法的返回值为 sysUserwhen(sysUserService.getById(id)).thenReturn(sysUser);// 调用被测试的方法// 调用 sysUserController 的 selectOne 方法,并传入 id 参数ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);// 如果 responseResult 的 Code 字段等于 200
//        if (responseResult.getCode() == 200) {
//            // 打印 responseResult 的 JSON 字符串形式
//            System.out.println(JSON.toJSONString(responseResult));
//        }// 断言验证结果assert (responseResult.getData().getUserName().equals(sysUser.getUserName()));}
}
完整启动Spring框架

避免手动注入字段。
注意:完整启动的话->Mockito测试框架中来模拟一个对象的行为会失效(when()失效)。
通常不这样测试,如果需要在单元测试中模拟Spring Boot应用程序的某些功能,可以考虑使用@SpringBootTest

@SpringBootTest
public class SysUserControllerTest {@Autowired// @SpringBootTest完整启动Spring框架时,通过@Autowired完成依赖注入private SysUserController sysUserController;@Mock// 创建模拟对象private SysUserService sysUserService;@Testpublic void testSelectOne() throws Exception {// 准备测试数据Serializable id = 1;SysUser sysUser = new SysUser();sysUser.setId(1L);sysUser.setUserName("admain");// 设置mock对象行为// 设置sysUserService的 getById 方法的返回值为 sysUserwhen(sysUserService.getById(id)).thenReturn(sysUser);// 调用被测试的方法// 调用 sysUserController 的 selectOne 方法,并传入 id 参数ResponseResult<SysUser> responseResult = sysUserController.selectOne(id);// 如果 responseResult 的 Code 字段等于 200
//        if (responseResult.getCode() == 200) {
//            // 打印 responseResult 的 JSON 字符串形式
//            System.out.println(JSON.toJSONString(responseResult));
//        }// 断言验证结果assert (responseResult.getData().getId().equals(sysUser.getId()));}
}
http://www.lryc.cn/news/242127.html

相关文章:

  • 机器学习数据集整理:图像、表格
  • Vue: Cannot find module @/xx/xx/xx.vue or its corresponding type declarations.
  • 怎样自动把网页截图发到微信群里
  • Netty实现websocket且实现url传参的两种方式(源码分析)
  • 深入理解C语言指针:基础概念、语法和实际应用
  • 百度云加速免费版下线,推荐几款目前仍旧免费的CDN
  • HarmonyOS(五)—— 认识页面和自定义组件生命周期
  • DevExpress WinForms TreeMap组件,用嵌套矩形可视化复杂分层数据
  • IO口速度影响了什么?
  • Verilog基础:时序调度中的竞争(一)
  • nginx 配置静态缓存全教程 (以及静态缓存文件没有生成)
  • 自己动手打包构建编译cri-dockerd
  • Self-Supervised Exploration via Disagreement论文笔记
  • 【网络奇幻之旅】那年我与区块链技术的邂逅
  • 1.5.1 git/svn日志格式规范
  • [autojs]ui线程中更新控件的值的问题
  • 机器视觉技术在现代汽车制造中的应用
  • 学习视频剪辑方法:AI智剪助力,批量处理短视频无忧
  • 振南技术干货集:制冷设备大型IoT监测项目研发纪实(3)
  • 1143. 最长公共子序列
  • EASYEXCEL(一)
  • 竞赛YOLOv7 目标检测网络解读
  • 第一类曲线积分@对弧长的曲线积分
  • 【TypeScript】常见数据结构与算法(二):链表
  • 原型模式 (Prototype Pattern)
  • 项目总结报告(案例模板)
  • C++ Qt QByteArray用法介绍
  • 蓝桥杯物联网竞赛_STM32L071_3_Oled显示
  • python-opencv轮廓检测(外轮廓检测和全部轮廓检测,计算轮廓面积和周长)
  • LeetCode [简单] 1. 两数之和