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

  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.xdnf.cn/news/33910.html

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

相关文章

JAVA-平台模块系统原理

菜鸟为了巩固所写 目录 菜鸟为了巩固所写 代码之间的依赖性 绘制类型依赖图 扩展到包之间的依赖关系 进一步延伸到jar包之间的依赖性 组件依赖图 JAVA技术领域中的两个著名的“擦除” Java类型的“大泥球” JAVA模块解析 模块解析的过程 模块路径明确模块的搜索与…

DevExtreme JS ASP.NET Core v24.2新功能预览 - 全新的聊天组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

总结与反思-50天小总结

作者&#xff1a;麻瓜也要学魔法 时间&#xff1a;2024/12/4 不知不觉中咱博客的码龄居然50天了&#xff01;内容主要就是运维方面的知识&#xff0c;主打一个学到哪发到哪。 看了看&#xff0c;50天欸&#xff01;刚好就50篇文章&#xff0c;不得不说&#xff08;咱还是真稳定…

centos8 mysql 主从复制

原理 一、一主一从 准备工作 1.主库配置 1、修改配置文件 /etc/my.cnf #mysql 服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;取值范围:1-232-1&#xff0c;默认为 server-id1 #是否只读,1 代表只读,0代表读写 read-only0 #忽略的数据,指不需要同步的数据库 #binlog…

iptables防火墙SNAT与DNAT

第二章 iptables防火墙SNAT与DNAT 文章目录 第二章 iptables防火墙SNAT与DNAT1 SNAT1.1 SNAT原理与应用1.2 SNAT工作原理1.3 SNAT转换前提条件2 SNAT示例2.1 网关[服务器配置](https://so.csdn.net/so/search?q服务器配置&spm1001.2101.3001.7020)2.1.1 网关服务器配置网卡…

【推荐100个unity插件之36】Unity6使用DOTS基础篇——Entities(非常适合做一些弹幕射击游戏)

文章目录 前言DOTS 核心组成DOTS 解决传统问题的痛点1、优化内存布局&#xff1a;2、减少垃圾回收和内存管理开销&#xff1a;3、提高并行计算能力&#xff1a;4、高效的系统和组件设计&#xff1a;5、易于扩展和优化&#xff1a; 安装文档在编辑器下构建 ECS World查看Entity的…

AI一键生成原创圣诞印花图案

一、引言 随着科技的飞速发展&#xff0c;AI 已经深入到我们生活和工作的各个角落&#xff0c;为创意设计领域带来了前所未有的变革。在圣诞即将来临之际&#xff0c;想要设计独特的圣诞印花图案却又担心缺乏灵感或专业技能&#xff1f;别担心&#xff0c;千鹿 AI 为我们提供了…

第一部分 —— 密文类型

文章目录 1. Abstract1.1 Some Conceptions 2. TFHE Ciphertexts3. GLWE3.1 Trivial GLWE ciphertexts3.2 LWE 和 RLWE3.3 Public key encryption 4. GLev4.1 Lev and RLev 5. GGSW5.1 GSW and RGSW 1. Abstract TFHE 指的是 全同态加密策略。意思是&#xff0c;允许对密文进行…

进制转换详解

进制转换的基本概念 进制转换是将一个数从一种基数&#xff08;进制&#xff09;转换为另一种基数的过程。例如&#xff0c;将十进制数转换为二进制、八进制或十六进制。 转换过程 以十进制数转换为其他进制为例&#xff0c;转换的基本步骤如下&#xff1a; • 除以目标进制…

构建数字影像生态群,致力推动数字经济发展

在当今数字化浪潮汹涌澎湃的时代&#xff0c;数字经济逐渐成为全球经济增长新的核心驱动力。国际数字影像产业园作为数字影像领域的创新高地&#xff0c;正以其独特的优势和不懈的努力&#xff0c;为推动数字经济的蓬勃发展贡献着卓越力量。 国际数字影像产业园凭借其优越的地理…

性能测试工具1:perf

1.介绍 perf是linxu下的一款性能分析工具。Linux的性能计数器是一个新的基于内核的子系统&#xff0c;它为所有性能分析提供了一个框架。它包括硬件级别&#xff08;CPU/PMU、性能监控单元&#xff09;功能和软件(软件计数器、跟踪点)功能。 通过perf,应用程序可以利用PMU…

学籍照片电子版手机拍照采集且批量自动命名的方法

学籍照片作为学生档案的重要组成部分&#xff0c;其电子版的采集和管理显得尤为重要&#xff0c;目前主要通过“全国学籍信息管理系统”进行管理。传统的拍照和命名方式不仅耗时耗力&#xff0c;而且容易出现错误。为了提高效率和准确性&#xff0c;下面介绍如何由教师自己使用…

在wsl2中安装archlinux

在之前的博客中&#xff0c;我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置&#xff0c;但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利&#xff0c;在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…

蓝桥杯真题1259奇怪的捐赠(python版)

解题思路:将100万转换为7进制数,数位之和就是分成的份数 num 100_0000 sum 0 while num > 0:remainder num % 7num num // 7sum remainder print(sum)代码来自题目题解 num对7进行取余&#xff0c;取值范围理应是[0,1,2,3,4,5,6] 但是对于题目给定的捐赠金额实际上并不…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 &#xff0c;学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库&#xff0c;常见的内置库&#xff08;random、hashlib、json、时间、os&#xff09; 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Redis面试专题-持久化

前言 开始Redis面试知识的复习和资料的收集&#xff08;收集和参考了网上的优质文章&#xff09;&#xff0c;本篇文章会不断更新&#xff0c;本系列文章主要分为两部分&#xff0c;一部分是该专题所涉及的相关基础知识&#xff0c;另一部分是面试题与思考题&#xff0c;大部分…

Altium Designer基础知识2:交互式差分布线

Altium Designer基础知识2&#xff1a;交互式差分布线 一、本文内容与前置知识点1. 本文内容2. 所用软件 二、差分式布线介绍1. 介绍2. 使用场景 三、布线流程1. 创建差分式布线对2. 布线 一、本文内容与前置知识点 1. 本文内容 Altium Designer的基础知识&#xff0c;差分布…

注意力机制的输入

注意力机制的输入 flyfish 注意力机制用于确定序列中每个组成部分相对于其他部分的相对重要性。 绘图源码 import matplotlib.pyplot as plt from matplotlib.patches import FancyArrowPatchplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

Anaconda创建虚拟环境+CUDA、cuDNN一同安装

文章目录 前言一、CUDA的作用二、下载CUDA的步骤2.1 查看电脑NVIDIA适合的CUDA版本&#xff08; 两种方法&#xff09;1&#xff09;打开NVIDIA控制面板&#xff0c;目前我的CUDA版本是12.12&#xff09;使用命令行查看&#xff0c;使用命令&#xff1a;nvidia-smi。 2.2 根据p…