Junit5 单元测试入门

news2025/1/11 21:57:44

基础知识

常用注解含义
  • @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 arg0

	return null;  });

doAnswer(invocation -> {

Object arg0 = invocation.getArgument(0);

// do something with arg0

return 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类中的静态方法来进行断言。以下是几种常见的断言方式:

  1. assertTrue(boolean condition)/assertFalse(boolean condition):断言条件是否为真

例如:assertFalse(5 < 4);

  1. assertEquals(Object expected, Object actual)/assertNotEquals(Object unexpected, Object actual):断言两个对象是否相等

例如:assertEquals(5, 5);

  1. assertNull(Object actual)/assertNotNull(Object actual):断言对象s是否为空

assertNotNull(new Object());

  1. assertSame(Object expected, Object actual)/assertNotSame(Object unexpected, Object actual):断言两个对象是否引用同一个对象

String str1 = “test”;

String str2 = str1;

assertSame(str1, str2);

  1. assertArrayEquals(Object[] expected, Object[] actual):断言两个数组是否相等

assertArrayEquals(new int[] {1, 2, 3}, new int[] {1, 2, 3});

  1. 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中的高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS in Depth 2 精译_065】第四部分:CSS 视觉增强技术 + 第 11 章 颜色与对比概述 + 11.1 通过对比进行交流

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 ✔️ 11.1.1 模式的建立 ✔️11.1.2 还原设计稿 ✔️ 11.2 颜色的定义 文章目录 第四部分 视觉增强技术 Visual e…

Java项目实战II基于微信小程序的作品集展示(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互联网技术的飞速…

基于rpcapd与wireshark的远程实时抓包的方法

基于rpcapd与wireshark的远程实时抓包的方法 服务端安装wireshark侧设置 嵌入式设备或服务器上没有图形界面&#xff0c;通常使用tcpdump抓包保存为pcap文件后&#xff0c;导出到本地使用wireshark打开分析&#xff0c;rpcapd可与wireshark配合提供一种远程实时抓包的方案&…

记录一个Flutter 3.24单元测试点击事件bug

哈喽&#xff0c;我是老刘 这两天发现一个Flutter 3.24版本的单元测试的一个小bug&#xff0c;提醒大家注意一下。 老刘自己写代码十多年了&#xff0c;写Flutter也6年多了&#xff0c;没想到前两天在一个小小的BottomNavigationBar 组件上翻了车。 给大家分享一下事件的经过。…

JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?

类加载器分类 大家好&#xff0c;我是码哥&#xff0c;可以叫我靓仔&#xff0c;《Redis 高手心法》畅销书作者。 先回顾下&#xff0c;在 Java 中&#xff0c;类的初始化分为几个阶段: 加载、链接&#xff08;包括验证、准备和解析&#xff09;和 初始化。 而 类加载器&#x…

视频监控汇聚平台Liveweb视频安防监控实时视频监控系统操作方案

Liveweb国标GB28181视频平台是一种基于国标GB/T28181协议的安防视频流媒体能力平台。它支持多种视频功能&#xff0c;包括实时监控直播、录像、检索与回看、语音对讲、云存储、告警以及平台级联等功能。该平台部署简单、可扩展性强&#xff0c;支持全终端、全平台分发接入的视频…

Docker-Compose环境变量

Docker-Compose环境变量 背景配置文件修改docker-compose.yml在服务内部使用环境变量重新构建容器补充 背景 现状是通过Docker-Compose配置管理系统的各个容器服务、因为是微服务架构所以配置文件很多、但是例如数据库、redis、kafka等配置都是同一份但是需要在多个配置文件做…

cocotb pytest

打印python中的print &#xff0c; 应该使用 pytest -s pytest --junitxmltest_report.xml --htmlreport.html

openEuler yum 设置国内镜像

查看openEuler系统信息 cat /etc/os-release可以看到详细系统版本如下 NAME"openEuler" VERSION"24.09" ID"openEuler" VERSION_ID"24.09" PRETTY_NAME"openEuler 24.09" ANSI_COLOR"0;31"系统使用的版本是24.0…

电脑鼠标箭头一直闪烁怎么回事?原因及解决方法

电脑鼠标箭头不停闪烁&#xff0c;很多用户都曾遇到过&#xff0c;就是点击也无法点击&#xff0c;只能看到箭头一直闪动。造成这种故障的原因有很多&#xff0c;可能是硬件、软件或系统的问题。本文将介绍电脑鼠标箭头不停闪烁的可能原因和相应的解决方法&#xff0c;帮助大家…

【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

Qt6.8 QGraphicsView鼠标坐标点偏差

ui文件拖放QGraphicsView&#xff0c;src文件定义QGraphicsScene赋值给图形视图。 this->scene new QGraphicsScene();ui.graph->setScene(this->scene);对graphicview过滤事件&#xff0c;只能在其viewport之后安装&#xff0c;否则不响应。 ui.graph->viewport…

TxT360: 一个大规模、高质量、多源融合的数据集,专为预训练大型语言模型设计。

2024-10-04, LLM360项目团队创建了TxT360数据集&#xff0c;这个数据集通过整合多种数据源&#xff0c;为预训练大型语言模型提供了丰富的训练材料&#xff0c;具有重要的研究和应用价值。 数据集地址&#xff1a;TxT360|预训练语言模型数据集|预训练数据集 一、研究背景&…

计算机网络-GRE基础实验二

前面我们学习了GRE隧道的建立以及通过静态路由指向的方式使得双方能够网络互联&#xff0c;但是通过静态路由可能比较麻烦&#xff0c;GRE支持组播、单播、广播因此可以在GRE隧道中运行动态路由协议使得网络配置更加灵活。 通过前面的动态路由协议的学习我们知道动态路由协议都…

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器&#xff0c;用于系统授权。一般不会编写自定义的授权过滤器&#xff0c;而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…

Pixtral Large开源:Mistral AI的1240亿参数多模态模型超越GPT-4o等竞争对手

Pixtral Large是什么 Pixtral Large是由法国人工智能初创公司Mistral AI开发的超大多模态模型&#xff0c;拥有1240亿参数&#xff0c;2024年11月18日正式对外发布。它基于Mistral Large 2开发而成&#xff0c;具备1230亿参数的多模态解码器和10亿参数的视觉编码器。这个模型能…

【Diffusion分割】基于先验知识的显式-隐式扩散模型用于医学图像分割

扩散概率模型(DPM)在当前的图像生成任务中取得了无与伦比的成果,最近的一些研究工作将其应用于多个计算机视觉任务中,如图像超分辨率、物体检测等。得益于 DPM 生成细粒度细节的卓越能力,这些研究工作取得了显著的成果。在本文中,提出了一种新的基于 DPM 的生成式医学图像…

双目相机的标定,视差图,深度图,点云生成思路与实现。

该文档记录从双目相机标定到点云生成的所有过程&#xff0c;同时会附上代码。 代码直接能跑。https://github.com/stu-yzZ/stereoCamera 目录 大致思路如下&#xff1a; 一、相机标定 1、相机参数介绍 2、单目相机标定 3、双目相机标定 二、图片畸变矫正 三、极线矫正…

记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009

项目是个老项目&#xff0c;依赖包也比较大&#xff0c;咱就按正常流程走一遍来详细解决这个问题&#xff0c;先看一下node版本&#xff0c;我用的是nvm管理的&#xff0c;详细可以看我的其他文章 友情提醒&#xff1a;如果项目比较老&#xff0c;包又大&#xff0c;又有一些需…

秒懂:使用js验证hash, content hash , chunk hash的区别

一、使用js验证hash, content hash , chunk hash的区别 1、计算一般的 Hash&#xff08;以简单字符串为例&#xff09; 使用crypto-js库来进行哈希计算&#xff0c;需提前引入npm install crypto-js库。 crypto-js&#xff1a; 是一个JavaScript加密算法库&#xff0c;用于实…