Junit5 单元测试入门
基础知识
常用注解含义
- @Test:标记一个方法为测试方法
- @BeforeEach:标记的方法会在每个测试方法执行前执行
- @AfterEach:标记的方法会在每个测试方法执行后执行
- @BeforeAll:标记的方法会在所有测试方法执行前执行一次
- @AfterAll:标记的方法会在所有测试方法执行后执行一次
- @Disabled:用于禁用一个测试方法或测试类
- Assertions:JUnit Jupiter 提供了一系列的断言方法,用于测试你的代码的行为。例如:assertEquals(expected, actual),assertTrue(condition)等
- @ParameterizedTest:用于定义参数化测试,可以用不同的参数多次运行同一个测试方法
- @ExtendWith:用于定义一个扩展类,扩展类可以改变测试的行为,例如提供依赖注入、处理异常等
初始化Mock对象的三种方式
-
@ExtendWith(MockitoExtension.class) + @Mock等注解

-
Mockito.mock(X.class)

-
MockitoAnnotations.openMocks(this) + @Mock等注解

常见的Mock方法的方式
a. thenReturn()/doReturn():当需要根据特定的调用来返回一个固定的值
when(mockObject.method()).thenReturn(value);
或 doReturn(value).when(mockObject).method();
b. thenThrow()/doThrow():当想在方法被调用时抛出一个异常
when(mockObject.method()).thenThrow(new RuntimeException());
或 doThrow(new RuntimeException()).when(mockObject).method();
c. thenAnswer()/doAnswer():当需要基于输入的参数来返回值,或者需要多次调用返回不同的值
when(mockObject.method(anyString())).thenAnswer(invocation -> {
Object arg0 = invocation.getArgument(0);// do something with arg0return null; });或
doAnswer(invocation -> {
Object arg0 = invocation.getArgument(0);// do something with arg0return null;}).when(mockObject).method(anyString());
d. thenCallRealMethod()/doCallRealMethod():当想在调用一个mock对象的方法时,真的调用实现该方法的代码
when(mockObject.method()).thenCallRealMethod();
或:doCallRealMethod().when(mockObject).method();
e. doNothing():这个用于定义一个方法在被调用时什么都不做,通常用于 mock 一些返回 void 的方法
doNothing().when(mockedList).clear();
注意:doXxx().when(obj).someMethod(); 与 when(obj.someMethod()).thenXxx() 这两种结构在大部分情况下可以互换使用,但在某些特定情况下,它们之间存在一些差异。以下是一些关键的区别:
-
对于非 void 方法,doReturn().when() 结构可以用在 mock 的方法在调用时抛出异常的情况下,而 when().thenReturn() 结构不能。这是因为 when().thenReturn() 结构会首先调用实际的方法,如果该方法抛出异常,那么程序就不能正常工作。而 doReturn().when() 结构不会调用实际的方法,所以即使方法抛出异常程序也能正常工作
<font style="background-color:#D8DAD9;">doReturn("mocked value").when(mock).method(); // 这里不会调用实际的方法</font> -
对于 void 方法,doReturn().when() 结构不能用,需要使用 doNothing().when(mock).method(),doThrow().when(mock).method() 或 doAnswer().when(mock).method() 等结构
doNothing().when(mock).method(); // 对于 void 方法,需要使用 doNothing()
因此,根据需求和方法的特性(是否为 void,是否在调用时抛出异常),可以选择适当的结构,在大部分情况下,when().thenReturn() 结构更简洁,更易读,推荐使用。但如果需要处理特殊情况,如上述的情况,就需要使用 doReturn().when() 结构
常见的断言方式
在JUnit 5中,我们通常使用org.junit.jupiter.api.Assertions类中的静态方法来进行断言。以下是几种常见的断言方式:
- assertTrue(boolean condition)/assertFalse(boolean condition):断言条件是否为真
例如:assertFalse(5 < 4);
- assertEquals(Object expected, Object actual)/assertNotEquals(Object unexpected, Object actual):断言两个对象是否相等
例如:assertEquals(5, 5);
- assertNull(Object actual)/assertNotNull(Object actual):断言对象s是否为空
assertNotNull(new Object());
- assertSame(Object expected, Object actual)/assertNotSame(Object unexpected, Object actual):断言两个对象是否引用同一个对象
String str1 = “test”;
String str2 = str1;
assertSame(str1, str2);
- assertArrayEquals(Object[] expected, Object[] actual):断言两个数组是否相等
assertArrayEquals(new int[] {1, 2, 3}, new int[] {1, 2, 3});
- assertThrows(Class<? extends Throwable> expectedType, Executable executable):断言执行某段代码是否会抛出特定类型的异常。
assertThrows(NullPointerException.class, () -> {
throw new NullPointerException();
});
此外,Mockito 的 verify() 方法被用来确认某个特定的方法是否被调用了指定的次数
例如,如果想确认某个mock对象的某个方法是否被调用过:
Mockito.verify(mockObject).method();
如果想确认某个方法被调用了特定的次数:
Mockito.verify(mockObject, times(5)).method();
如果想确认某个方法从未被调用过:
Mockito.verify(mockObject, never()).method();
覆盖度查看
源代码中绿色区域为已被测试覆盖,红色区域为未被测试覆盖
注意:IDEA和JaCoCo计算代码覆盖率的方式略有不同,例如:JaCoCo提供了分支覆盖,而IDEA可能只提供了线性代码覆盖,假如代码中包含了复杂的条件逻辑,那么这可能会导致覆盖率的差异。在IDEA中看到的覆盖度会比在JaCoCo中的高
相关文章:
Junit5 单元测试入门
基础知识 常用注解含义 Test:标记一个方法为测试方法BeforeEach:标记的方法会在每个测试方法执行前执行AfterEach:标记的方法会在每个测试方法执行后执行BeforeAll:标记的方法会在所有测试方法执行前执行一次AfterAll࿱…...
数字信号处理-数学基础
来源哪都有,个人复习使用 一 积分 常用积分公式: 基本积分方法 凑微分法(也称第一换元法): 换元: 分部积分: 卷积 这里有动图解释: https://mathworld.wolfram.com/Convolution.html 欧拉公式 e i x…...
【Exp】# Microsoft Visual C++ Redistributable 各版本下载地址
Microsoft官方页面 https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads Redistributable 2019 X86: https://aka.ms/vs/16/release/VC_redist.x86.exe X64: https://aka.ms/vs/16/release/VC_redist.x64.exe Redistributable 201…...
Hive 分桶表的创建与填充操作详解
Hive 分桶表的创建与填充操作详解 在 Hive 数据处理中,分桶表是一个极具实用价值的功能,它相较于非分桶表能够实现更高效的采样,并且后续还可能支持诸如 Map 端连接等节省时间的操作。不过,值得注意的是,在向表写入数…...
[小白系列]Ubuntu安装教程-安装prometheus和Grafana
Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。(/data/prometheus/可根据自己需要调整) global:scrape_interval: 15s # By default, scrape targets ev…...
Flask使用长连接
Flask使用flask_socketio实现websocket Python中的单例模式 在HTTP通信中,连接复用(Connection Reuse)是一个重要的概念,它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应,而不是为每个新的请求/响…...
数据分析思维案例:游戏评分低,怎么办?
【面试题】 某款手游在应用市场评分相比同类型游戏处于劣势。 请分析可能的原因并给出相关建议。 【分析思路】 一、明确问题 1. 明确业务指标 定义:应用市场评分一般指某一应用在某个应用市场上线以来的总体平均评分。 除“总体平均评分”以外,部分应用…...
【学习总结|DAY012】Javabean书写练习
一、主要代码 public class Phone {public Phone() {}public Phone(String brand, int price, String color) {this.brand brand;this.price price;this.color color;}String brand;int price;String color;public String getBrand() {return brand;}public void setBrand(…...
Mac环境下brew安装LNMP
安装不同版本PHP 在Mac环境下同时运行多个版本的PHP,同Linux环境一样,都是将后台运行的php-fpm设置为不同的端口号,下面将已php7.2 和 php7.4为例 添加 tap 目的:homebrew仅保留最近的php版本,可能没有你需要的版本…...
openEuler 知:安装系统
文章目录 前言图形化安装文本方式安装 前言 本文只介绍安装过程中需要特别注意的地方,常规的内容需要参考其它文档。 图形化安装 自定义分区: 说明:anaconda 默认分区,在 OSNAME.conf 中进行了配置,openEuler 默认根…...
Zephyr 入门-设备树与设备驱动模型
学习链接:https://www.bilibili.com/video/BV1L94y1F7qS/?spm_id_from333.337.search-card.all.click&vd_source031c58084cf824f3b16987292f60ed3c 讲解清晰,逻辑清楚。 1. 设备树概述(语法,如何配置硬件,c代码如…...
点云标注软件SUSTechPOINTS的安装和使用,自测win10和ubuntu20.04下都可以用
点云标注软件SUSTechPOINTS的安装和使用 github项目源码:https://github.com/naurril/SUSTechPOINTS gitee源码以及使用教程:https://gitee.com/cuge1995/SUSTechPOINTS 首先拉取源码 git clone https://github.com/naurril/SUSTechPOINTS最好是在cond…...
etcd资源超额
集群内apiserver一直重启,重启kubelet服务后查看日志发现一下报错: Error from server: etcdserver: mvcc: database space exceeded 报错原因: etcd服务未设置自动压缩参数(auto-compact) etcd 默认不会自动 compa…...
AndroidStudio-常见界面控件
一、Button package com.example.review01import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextViewclass Review01Activity : AppCompatActivity() {override fun onCreate(savedInstanceStat…...
网络协议(TCP/IP模型)
目录 网络初识 网络协议 协议分层 协议拆分 分层 协议分层的优势 1.封装效果 2.解耦合 TCP/IP五层模型 协议之间配合工作(详解) 网络初识 网络核心概念: 局域网:若干电脑连接在一起,通过路由器进行组网。 …...
python 清华pip镜像源报HTTP error 403
报错信息 ERROR: HTTP error 403 while getting https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/52/79/a64937a2185b91a96cc5406e3ea58120980c725543d047e112fb3084a972/fake_useragent-2.0.0-py3-none-any.whl (from https://mirrors.tuna.tsinghua.edu.cn/pypi/we…...
swift 屏幕录制
步骤 1:导入 ReplayKit import ReplayKit步骤 2:开始录屏 let screenRecorder RPScreenRecorder.shared() // 麦克风或系统音频 screenRecorder.isMicrophoneEnabled truefunc startRecording() {guard screenRecorder.isAvailable else {print(&quo…...
通过精密时间协议(PTP)对计算机网络中的多个设备进行时间同步
PTP 模块 - 使用教程 目录 PTP 模块 - 使用教程简介第 1 步:为主时钟创建一个 PTP 时钟实例第 2 步:添加 PTP 端口第 3 步:查询 PTP 时钟或 PTP 端口的状态第 4 步:清除 FAULTY 状态第 5 步:为 PTP 事件安装处理程序第…...
Docker 安装系列
Centos8 安装Docker Docker安装mysql8.0 Docker安装稳定版本nginx-1.26.2 Docker 安装最新版本 Jenkins Docker Redis Docker 安装 eclipse-mosquitto Docker mongo:5.0 Docker 安装 Redis的完全体版本RedisMod docker pull elasticsearch:8.0.0 docker 安装nacos v2.…...
使用springboot-3.4.1搭建一个netty服务并且WebSocket消息通知(适用于设备直连操作,以及回复操作)
引入最新版本 <!--websocket--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>启动类加入 //netty 协议服务端口启动 NettyTcpHandler.start()…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
