Unit Test 5--编写第一个单元测试

2023-10-27

大家好,我是神韵,是一个技术&生活博主。出文章目的主要是两个,一是好记忆不如烂笔头,记录总结中提高自己。二是希望我的文章可以帮到大家。欢迎来点赞打卡,你们的行动将是我无限的动力。
本篇主题是:编写第一个单元测试

其它文章链接:
Unit Test 1–什么是单元测试
Unit Test 2–IDEA配置并查看单元覆盖率
Unit Test 3–编写单元测试之前需要了解的单元测试框架Mock
Unit Test 4–自动生成单元测试插件之TestMe与Diffblue
Unit Test 6–单元测试踩过的坑
Unit Test 7–单元测试覆盖率表单生成交付,Jacoco的使用
Controller 层的单元测试怎么写?
同一个类的方法怎么Mock?spy函数啦

上一篇文章介绍了两个插件,1是Diffbule,2是TestMe,如果用第一款插件可以省事很多。本篇文章主要是介绍单元测试编写,一般建议通过插件生成后再自己进行修改即可

项目所需依赖

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <version>3.9.0</version>
    </dependency>

  </dependencies>

1、controller层 Unit Test

2021/11/24 add - 最新参考:Controller 层的单元测试怎么写?
因为如果通过MVC是比较复杂的,但是应该是最正确的方式,但是上面链接的也可以,简单快捷。

需要编写单元测试的类UnitTestController.java

@RestController
public class UnitTestController {
    @Autowired
    private UnitTestService unitTestService;

    @PostMapping("/unitTest")
    public UnitTestRspDTO unitTest(@RequestBody UnitTestReqDTO unitTestReqDTO) {
        UnitTestEntity unitTestEntity = unitTestService.queryUnitTestByContent(new UnitTestEntity(unitTestReqDTO.getId(), unitTestReqDTO.getContent()));
        UnitTestRspDTO unitTestRspDTO = new UnitTestRspDTO();
        unitTestRspDTO.setId(unitTestEntity.getId());
        unitTestEntity.setContent(unitTestEntity.getContent());
        return unitTestRspDTO;
    }
}

1、Controller层需要通过Mvc去调用,这个类上需要指定加载测试类的容器(controller特有,后面需要Mock Mvc)
在这里插入图片描述
2、之前文章提到过,编写单元测试几步走

  1. 准备测试数据 (重)
    在这里插入图片描述

  2. Mock需要的对象,Mock具体行为
    需要注入对象MockMvc,通过Mvc调用URL(controller特有)
    Mock 业务类,本来是真实注入业务类UnitService,这里去模拟一个它然后去模拟行为
    在这里插入图片描述
    Mock具体行为,返回第一步制造的数据
    在这里插入图片描述

  3. 构建请求数据
    post调用/json传参
    在这里插入图片描述
    ps:如果真实代码没有里面没有用到传入的参数,也可以用"{}"来传
    在这里插入图片描述ps:如果是get方法如下
    在这里插入图片描述

  4. 做真实调用需要测试的方法调用并比对结果
    在这里插入图片描述

至此一个controller测试案例到此结束
完整代码

@RunWith(SpringRunner.class)
@WebMvcTest(UnitTestController.class)
public class UnitTestControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private UnitTestService unitTestService;

    @Test
    public void testUnitTest() throws Exception {
        // mock行为
        when(unitTestService.queryUnitTestByContent(any())).thenReturn(getUnitTestEntity());

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/unitTest")
                .contentType(MediaType.APPLICATION_JSON) // 参数接收类型,json
                .content(new ObjectMapper().writeValueAsString(getUnitTestEntity())); // 参数内容 json
        mockMvc.perform(requestBuilder).andExpect(status().isOk()); // 响应验证
    }

    // 测试数据
    private UnitTestEntity getUnitTestEntity() {
        return new UnitTestEntity(1, "test");
    }
}

2、Service层 Unit Test

service层不像controller需要从URL入手,这个就简单很多~~

需要编写单元测试的类UnitTestService.java

@Service
public class UnitTestService {
    @Autowired
    private UnitTestRepository unitTestRepository;

    public UnitTestEntity queryUnitTestByContent(UnitTestEntity unitTestEntity) {
        return unitTestRepository.findByContent(unitTestEntity.getContent());
    }
}
  1. 准备测试数据
    在这里插入图片描述
    2、Mock对象及行为
    对于本身类,需要做调用的通过@InjectMocks去Mock
    这里Mock 其他类没用MockBean,因为没有类上没有启用容器(如WebMvcTest/SpringBootTest…),MockBean会失败~~
    在这里插入图片描述
    在这里插入图片描述
    3、做真实代码调用
    在这里插入图片描述
    4、对比结果
    在这里插入图片描述
    完整代码:
@RunWith(MockitoJUnitRunner.class)
public class UnitTestServiceTest {

    @InjectMocks
    private UnitTestService unitTestService;
    @Mock
    private UnitTestRepository unitTestRepository;

    @Test
    public void testQueryUnitTestByContent() {
        // 模拟行为--unitTestRepository.findAll(),并指定返回自己想要的结果
        Mockito.when(unitTestRepository.findByContent(any())).thenReturn(getUnitTestEntity());
        // 调用service方法
        UnitTestEntity unitTestEntity = unitTestService.queryUnitTestByContent(getUnitTestEntity());
        // 校验结果
        Assert.assertEquals(getUnitTestEntity().getId(), unitTestEntity.getId());
    }

    // 制造一个返回结果
    private UnitTestEntity getUnitTestEntity() {
        return new UnitTestEntity(1, "test");
    }
}

3、Dao层

这里我们使用的是JPA,没有用到这一层的单元测试,略…

4、测试结果

好,现在我们来运行一下单元测试案例,看下我们编写了两个测试类的效果,具体前面怎么配置和运行已经写过文章
在这里插入图片描述
结果如下:
controller/service覆盖率为100%~
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unit Test 5--编写第一个单元测试 的相关文章

  • 码农得用专用的Code字体,推荐几款专业级别的程序员专用字体

    别怀疑 下面的这些字体是程序员专用的编码字体 尤其是带 Code 名字的字体 从名字上看就知道 专门用来Code用的 1 Source Code Pro PS那个公司知道吧 就是这个公司专门为程序员设计的等宽字体 要知道 写代码 一般的字体
  • 光束法空三的计算问题,误差方程的多余观测数,未知数个数、多余观测值的计算

    1 未知数个数 必要观测值个数 未知数个数 t u 3 未知点数目 6 相片数目 3 代表一个未知点的 x y z 6代表一张像片的6个外方位元素 都是待定值 都是未知数 2 观测值个数 1 未知数个数求法 1 观测值个数 n 2 m 的含
  • sparksql压缩小文件

    SET spark sql shuffle partitions 2 SET spark sql adaptive enabled true SET spark sql adaptive shuffle targetPostShuffleI
  • Kotlin 常见符号大全

    gt 下划线 as 1 修饰在成员变量的类型后面 表示这个变量可以为null 系统在任何情况下不会报它的空指针异常 修改在对象后面代表该对象如果为null则不处理后面逻辑 如果我们定义的变量是一个可以为空的类型 则要用 String 在变量
  • Qt、MinGW编译OpenCV 4.5.4(包含opencv_contrib)详细过程

    Qt MinGW CMake编译OpenCV 4 5 4 包含opencv contrib 详细过程 目录 Qt MinGW CMake编译OpenCV 4 5 4 包含opencv contrib 详细过程 1 工具下载准备 2 CMak
  • Linux·异步IO编程框架

    hi 大家好 今天分享一篇Linux异步IO编程框架文章 对比IO复用的epoll框架 到底性能提高多少 让我们看一看 译者序 本文组合翻译了以下两篇文章的干货部分 作为 io uring 相关的入门参考 How io uring and
  • ZGC的运行过程以及读屏障

    ZGC运作过程 ZGC的运作过程大致可划分为以下四个大的阶段 并发标记 Concurrent Mark 与G1一样 并发标记是遍历对象图做可达性分析的阶段 它的初始标记 Mark Start 和最终标记 Mark End 也会出现短暂的停顿
  • 了解前端监控和埋点(持续更新中,,,)

    基本概念 前端埋点主要是为了运营以及开发人员采集用户行为数据 以及页面性能等数进行后续的数据分析 一般目的 1 性能监控 2 数据监控 3 异常监控 埋点方案 5 代码埋点 6 无埋点 7 可视化埋点 埋点的目的 在现今用户就是上帝的年代
  • 会话保持和非会话保持

    会话保持 方式 1 session机制保持会话 缺点 1 1当前服务器处于高并发的时候 对于服务器是一个压力 占用大量的服务器资源 1 2如果一个业务系统是分布式部署在多个服务器的情况下 session不能相互间共享 解决方式 1 3高并发
  • 十个常见异常实例

    第一个 try float j 1 0 catch Exception e exceptions add e 第二个 try String s null String m s toLowerCase catch Exception e ex
  • 常见软件开发模式

    一 瀑布模型 瀑布模型的特点 1 阶段间具有顺序性和依赖性 2推迟实现 3质量保证的观点 总结 瀑布模型是文档驱动的模型 遵守这个约束可使软件维护变得比较容易一些 从而显著降低软件预算 二 快速原型 快速分析 gt 构造 gt 运行 gt
  • NOIP 1998 普及组 2的幂次方 解题报告

    虽说是普及组 还是不好处理啊 想了好久 最后决定使用一个栈来维护所有的枚举 总的来说我这里算是用了两个栈 因为BFS本身就能算一个栈 这个题目真的有挑战性啊 算法没什么 但是规律方面的东西好重要饿 不说了 代码 include
  • 逻辑运算符详细讲解(基础版)

    本文将详细讲解6个逻辑运算符的应用 总结放在最后了哦 1 与 gt 见false则为false 这里用两个关系表达式进行比较 只要其中一个运算结果为false则最后结果也为false 2 或 gt 见true则为true 这里用两个关系表达
  • openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema

    文章目录 openGauss学习笔记 66 openGauss 数据库管理 创建和管理schema 66 1 背景信息 66 2 注意事项 66 3 操作步骤 66 3 1 创建管理用户及权限schema 66 3 2 使用schema 6
  • python-图形用户界面

    图形用户界面 1 python中图形界面库 界面开发 Tkinter 是 Python 官方提供的图形用户界面开发库 用于封装 TGUI 工具包 跨平台 PyQt 是非 Python 官方提供的图用户界面开发库 用于封装 Qt 工具包 跨平
  • 解决Xilinx Vitis 2020.1版本启动之后进入主页面无响应的结果

    一 问题描述 在启动 Xilinx Vitis 2021 1 时 无论是从 Xilinx Vivado 界面的 Launch Vitis 启动还是直接启动都会在启动后显示出主界面后未响应 其原因是 Windows 系统的 PATH 环境变量
  • dataframe iloc_pandas

    点击上方蓝字 关注并星标 和我一起学技术 今天是pandas数据处理专题第三篇文章 我们来聊聊DataFrame中的索引 上篇文章当中我们简单介绍了一下DataFrame这个数据结构的一些常见的用法 从整体上大概了解了一下这个数据结构 今天

随机推荐

  • 解决报错:java: You aren‘t using a compiler supported by lombok, so lombok will not work and has been dis

    解决idea 的因为lombok的报错 java You aren t using a compiler supported by lombok so lombok will not work and has been disabled Y
  • 【代码笔记】Transformer代码详细解读

    Transformer代码详细解读 文章目录 Transformer代码详细解读 简介 1 数据准备 1 1 词表构建 1 2 数据构建 2 模型整体架构 2 1 超参数设置 2 2 整体架构 2 2 模型训练 3 编码器 Encoder
  • source: no such file or directory: .bash_profile

    今天想看maven版本结果一直报未分配maven环境 因为用了idea后一直没顾上观察maven 直接打开vim bash profile 发现环境已经搭好了 没办法重新 source bash profile生效这个文件 结果报 经过网上
  • 启动Nessus服务后,登录https://localhost:8834时,提示无法访问网页

    安装Nessus后 登录https localhost 8834时提示网页无法访问 去到安装目录下的以系统管理员运行Nessusd exe时弹出提示nessusd exe启动失败 无法找到入口 无法作用于动态链接库C windows sys
  • system/WIFEXITED/WEXITSTATUS函数-linux

    system 感性认识 systerm两层含义 1 正确退出后 还需要再判断 操作成功或者操作失败 2 错误退出 include
  • TOMCAT配置:参数大小maxPostSize,参数个数maxParameterCount

    在更新了JSON校验器后 理论上不再存在问题 但是在使用JSON传递表单数据进行保存时依然出现了保存异常的情况 前台数据为7200个JSONObject组成的JSONArray 大小约为1 83M 其他参数若干 在参数传递到后台时发现后台并
  • 最新的Vivado安装、使用教程(2022/12/31)

    本文主要参考了黑金社区提供的资料 整理而成 目录 1 Vivado 开发环境 1 1 Vivado 软件介绍 1 2 Vivado 软件版本 2017 4比较稳定 2 Vivado 软件 Windows 下安装 3 重新安装驱动 4 大功告
  • 中位数(C语言)

    Description 计算有限个数的数据的中位数的方法是 把所有的同类数据按照大小的顺序排列 如果数据的个数是奇数 则中间那个数据就是这群数据的中位数 如果数据的个数是偶数 则中间那2个数据的算术平均值就是这群数据的中位数 现在给出n个正
  • Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

    面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类 GO 语言当中 NEW 和 MAKE 有什么区别吗 PRINTF SPRINTF FPRINTF 都是格式化输出 有什么不同 GO 语言当中数
  • xss-level1

    首先搭建xss靶场 打开浏览器输入地址来到第一关 这里我先查看了一下源代码 先试一下弹出会话框 name lt
  • 程序跑飞的如何查问题

    在下这厢有礼了 最近一直在调试公司的代码 调的我有点慢 给自己总结一下 我是在FPGA上调试 一个通信交互的工程 我遇到程序跑飞的无非是三种情况 1 数组越界 就是数组的大小只有array 100 但是那你用了array 500 产生越界
  • rk3368 开机内核启动不了

    Platform RK3368 OS Android 6 0 Kernel 3 10 0 电源管理芯片用的是配套的rk818 经测量发现板子在上电启动时 u boot阶段与kernel阶段dcdc电压不一样 从uboot切换到kernel时
  • 矩阵特征值与行列式、迹的关系

    矩阵的特征值之和等于矩阵的行列式 矩阵的特征值之积等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思考 x 2 bx c 0 这个方程的所有根的和等于多少 所有根的积等于多少 2 把二次方程推广到 N 次
  • Linux下安装opencv with-ffmpeg解决无法读取视频的问题

    Linux下安装opencv with ffmpeg解决无法读取视频的问题 参考文章 1 Linux下安装opencv with ffmpeg解决无法读取视频的问题 2 https www cnblogs com haiyang21 p 1
  • 求最大公约数,最小公倍数(c++)

    文章目录 最大公约数 质数和合数 公约数 计算最大公约数 辗转相除法 最小公倍数 最大公约数 质数和合数 质数也称素数 指大于1 并且除了1和它自己 不能被任何其他自然数整除的数 除了1和质数的其他自然数称为合数 合数必定可以分解成2个或以
  • Spring Cloud中的服务注册和发现是怎样实现的?Spring Boot和Spring Cloud的关系是怎样的?Spring的核心容器包括哪些模块?Spring的Bean作用域有哪些?它们的区

    1 Spring Cloud中的服务注册和发现是怎样实现的 在Spring Cloud中 服务注册和发现是通过Eureka来实现的 Eureka是Netflix开源的一个服务治理组件 用于实现服务注册和发现的功能 具体来说 服务的提供方会在
  • vue3使用jodit富文本编辑器,自定义各项配置及组件封装

    目录 常用配置 设置中文 字体设置 CDN的引用 图片上传 对编辑器中生成的元素添加默认属性 组件封装 本文使用时的版本 vue 3 2 36 jodit 3 24 7 Jodit 是国外编写的一个功能强大的富文本编辑器 有常规版本和PRO
  • “数据库事务(Database Transaction)

    事务的使用 关于事务 我今天要把自己放在一个初学者的心态来写这篇文章 之前几篇文章大多讲的是对于Winner的应用 今天要从根本上来讲 一下 事务 以及事务在Winner中的应用 首先从基础讲起 什么是 事务 事务能帮我们解决哪些问题 摘录
  • 每日一解 戳气球(困难的动归)

    题目 戳气球 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 如果你戳破气球 i 就可以获得 nums left nums i nums right 个硬币 这里的
  • Unit Test 5--编写第一个单元测试

    大家好 我是神韵 是一个技术 生活博主 出文章目的主要是两个 一是好记忆不如烂笔头 记录总结中提高自己 二是希望我的文章可以帮到大家 欢迎来点赞打卡 你们的行动将是我无限的动力 本篇主题是 编写第一个单元测试 其它文章链接 Unit Tes