SpringBoot基础(五):集成JUnit5
SpringBoot基础系列文章
SpringBoot基础(一):快速入门
SpringBoot基础(二):配置文件详解
SpringBoot基础(三):Logback日志
SpringBoot基础(四):bean的多种加载方式
SpringBoot基础(五):集成JUnit5
目录
- 一、JUnit5介绍
- 1、JUnit5组成结构
- 2、什么是单元测试
- 二、SpringBoot整合JUnit5
- 1、快速入门
- 2、测试类和测试方法不需要声明为public
- 3、@SpringBootTest工作原理
- 4、生成单元测试类
- 三、常用注解
- 1、@BeforeAll
- 2、@AfterAll
- 3、@BeforeEach
- 4、@AfterEach
- 5、@DisplayName
- 6、@Disabled
- 7、@RepeatedTest
- 四、常用断言
- 1、assertEquals(expected, actual)
- 2、assertNotEquals(expected, actual)
- 3、assertTrue(condition)
- 4、assertFalse(condition)
- 5、assertNull(actual)
- 6、assertNotNull(actual)
- 7、assertArrayEquals(expected, actual)
- 8、assertSame(expected, actual)
- 9、assertNotSame(expected, actual)
- 10、fail(message)
- 11、带有消息参数的断言
- 五、@MockBean注入
- 1、@MockBean的主要作用
- 2、@MockBean的典型用法(模拟数据层)
一、JUnit5介绍
JUnit5是一个功能强大的单元测试框架,是JUnit系列的最新版本,它引入了多个改进和新特性,旨在为Java应用程序提供灵活且模块化的测试支持。
1、JUnit5组成结构
- JUnit Platform:这个模块提供了测试的
启动API和运行环境,是整个JUnit5框架的核心。它支持在不同的环境中运行测试,如命令行、IDE或构建工具(例如Maven、Gradle) - JUnit Jupiter:这个模块包含了JUnit5的
新测试编写和扩展模型,提供了全新的注解、测试方法和扩展机制 - JUnit Vintage:为了支持旧版本的JUnit测试(JUnit3和JUnit4),JUnit5提供了Vintage模块。这个模块允许开发者继续运行以前版本的测试,同时过渡到JUnit5
2、什么是单元测试
- 单元测试是指对软件中的
最小可测试单元进行检查和验证的过程叫单元测试 - 在
SpringBoot中,最小可测试单元就是指方法
二、SpringBoot整合JUnit5
1、快速入门
- SpringBoot版本从
2.2以后,默认支持JUnit5
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
- 测试类应放在
src/test/java目录下

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class MySpringBootApplicationTests {@Testvoid contextLoads() {// 测试 Spring 应用上下文是否成功加载}
}
2、测试类和测试方法不需要声明为public
- 在
JUnit4中,测试类和测试方法必须是public的,因为JUnit4通过反射机制要求访问公共方法 - 而
JUnit5则没有这种要求,测试类和方法的可见性设为包级(默认)足够 JUnit 5 框架执行测试- 因为 JUnit 5 本质上是在测试框架内部执行这些测试
- 包级别的可见性允许同一包内的类访问测试类,而不需要将其暴露为 public
3、@SpringBootTest工作原理
它会启动整个Spring容器,加载应用程序的所有Bean,并创建一个完整的应用上下文。这是集成测试,因为它模拟了应用程序的真实运行环境。
查找主配置类的两种方式:
包扫描:默认情况下,@SpringBootTest 会从测试类所在的包开始,向上查找同一包或父包中带有 @SpringBootApplication或@SpringBootConfiguration注解的类,作为应用的配置类

显式指定:如果 @SpringBootTest 无法自动找到 @SpringBootApplication 注解的配置类,或者你希望手动指定配置类,你可以在@SpringBootTest 注解中使用classes属性显式指定应用的配置类

4、生成单元测试类
- 在需要生成单元测试的类中按
Alt +Ins,选择test(测试)

- 选择测试方法

- 生成的测试类放入与本类
相同的包结构下

三、常用注解
1、@BeforeAll
- 用于在
所有测试方法之前执行的静态初始化代码 - 通常用于在执行所有测试之前进行一次性设置,例如建立数据库连接、初始化共享资源等
- 被注解的方法必须是
static
@BeforeAll
static void setup() {System.out.println("Running setup before all tests...");
}
2、@AfterAll
- 用于在
所有测试方法执行完成后运行的静态清理代码 - 通常用于释放资源、关闭连接等操作
- 被注解的方法必须是
static
@AfterAll
static void tearDown() {System.out.println("Running teardown after all tests...");
}
3、@BeforeEach
- 用于在
每个测试方法之前执行的初始化代码 - 常用于在每个测试方法执行之前准备一些通用的数据或环境
@BeforeEach
void init() {System.out.println("Running setup before each test...");
}
4、@AfterEach
- 用于在
每个测试方法之后执行的清理代码 - 常用于在每个测试方法之后恢复原状或清理一些资源
@AfterEach
void cleanup() {System.out.println("Running cleanup after each test...");
}
5、@DisplayName
- 用于为测试类或测试方法提供一个更具可读性或说明性的
名称,便于在测试报告中展示

6、@Disabled
- 当执行
所有测试方法时候,@Disabled注解的方法不会执行

7、@RepeatedTest
- 用于多次
重复执行某个测试,可以指定重复次数

四、常用断言
断言(Assertions)在单元测试中用于验证程序行为是否符合预期。JUnit 提供了一组用于编写断言的方法,断言的使用可以帮助判断测试是否通过。类名org.junit.jupiter.api.Assertions
1、assertEquals(expected, actual)
- 验证两个对象
是否相等 - 可以用于
各种数据类型,包括基本类型、对象等
assertEquals(5, 2 + 3);
assertEquals("Hello", greetingService.getGreeting());
2、assertNotEquals(expected, actual)
- 验证两个对象
是否不相等
assertNotEquals(10, 2 + 3);
3、assertTrue(condition)
- 验证条件为
true
assertTrue(5 > 3);
4、assertFalse(condition)
- 验证条件为
false
assertFalse(3 > 5);
5、assertNull(actual)
- 验证对象是否为
null
String str = null;
assertNull(str);
6、assertNotNull(actual)
- 验证对象是否
不为null
String str = "Hello";
assertNotNull(str);
7、assertArrayEquals(expected, actual)
- 验证两个数组是否相等
- 数组的
长度和元素的顺序都必须相同
int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};
assertArrayEquals(expected, actual);
8、assertSame(expected, actual)
- 验证两个对象引用是否指向
同一个对象(即是同一个对象的引用)
Object obj = new Object();
assertSame(obj, obj);
9、assertNotSame(expected, actual)
- 验证两个对象引用是否
不指向同一个对象
Object obj1 = new Object();
Object obj2 = new Object();
assertNotSame(obj1, obj2);
10、fail(message)
- 强制使测试失败
- 通常用于标记不应该被执行的代码路径
if (someCondition) {fail("Unexpected condition occurred");
}
11、带有消息参数的断言
JUnit的断言方法通常有一个变体,可以带有一个额外的字符串参数,用于在测试失败时提供错误消息,帮助更快找到问题。

五、@MockBean注入
1、@MockBean的主要作用
- @MockBean会将应用上下文中的某个Bean
替换为模拟的Bean(Mock 对象) - @MockBean自动与Spring上下文集成,允许模拟的Bean被注入到需要它的其他Bean中
2、@MockBean的典型用法(模拟数据层)
假设我们有一个UserService依赖于UserRepository,而我们在测试中不想使用真实的UserRepository,而是使用模拟对象。
@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(Long id) {return userRepository.findById(id);}
}
- 使用
@MockBean来模拟UserRepository given方法模拟了userRepository.findById(1L)方法的调用,并定义了当该方法被调用时,willReturn表示返回一个mockUser对象
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;// 模拟 UserRepository,替换掉应用上下文中的实际 Bean@MockBeanprivate UserRepository userRepository;@Testvoid testGetUserById() {// 创建模拟数据User mockUser = new User(1L, "John Doe");// 使用 Mockito 的 BDD 风格方法设置模拟行为given(userRepository.findById(1L)).willReturn(mockUser);// 调用服务层方法,验证返回值是否符合预期User result = userService.getUserById(1L);assertEquals("John Doe", result.getName());}
}
相关文章:
SpringBoot基础(五):集成JUnit5
SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 SpringBoot基础(四):bean的多种加载方式 SpringBoot基础(五):集成JUnit5 目录 一、JUnit…...
正点原子学习笔记之汇编LED驱动实验
1 汇编LED原理分析 为什么要写汇编 需要用汇编初始化一些SOC外设 使用汇编初始化DDR、I.MX6U不需要 设置sp指针,一般指向DDR,设置好C语言运行环境 1.1 LED硬件分析 可以看到LED灯一端接高电平,一端连接了GPIO_3上面…...
网络学习第二篇
认识网关和路由器 这里大家先了解一下什么三层设备。 三层设备 三层设备是指在网络架构中能够工作在第三层(网络层)的设备,通常包括三层交换机和路由器。这些设备可以根据IP地址进行数据包的转发和路由选择,从而在不同的网络之间…...
一些小结汇总
1.常用浏览器及对应内核 Safari浏览器(苹果浏览器):Webkit内核 Google浏览器:Blink内核 Firefox:Gecko内核 Edge浏览器:Chromium内核 IE浏览器:Trident内核 2.10个块标签和10个行标签 …...
20240720 科大讯飞 笔试
文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.122、编程题2.12.22.33、选择题(Linux 选做)3.13.23.34、选择题(C++ 选做)4.14.24.34.44.54.64.75、选择题(数据库选做)5.15.25.3岗位:嵌入式开发工程师 题型: 必做:12 道选择题,3 道编程题 选做:Linux(3…...
【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯CoT思维链概述💯CoT思维链在大型语言模型中的应用💯CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 Ὂ…...
一、安装VMWARE和CentOS
一、安装VMware 1、基本说明 学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习 先安装virtual machine 15.5再安装Linux(CentOS 7.6/centos8.1)原理示意图 2、vmware15.5下载 官方地址:https://www.vmware.com/…...
岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类
岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类 岩石分类检测数据集 (Rock Classification and Detection Dataset) 描述: 本数据集旨在支持对不同类型的岩石进行自动分类和检测,特别适用于地质勘探、矿物识别、环境监测等领域。通过使用该数据集训练的模…...
电脑基础知识:mfc110.dll丢失的解决方法
1.mfc110.dll 丢失常见原因 mfc110.dll 文件的丢失或损坏是Windows系统中常见的问题,它可能由多种原因引起,以下是一些主要的因素: 不完全的软件卸载 在卸载程序时,如果相关的 DLL 文件没有被正确移除,可能会导致文件…...
Lua 协同程序(coroutine)
Lua 协同程序(coroutine) 概述 Lua 语言以其轻量级和易于嵌入的特点,在游戏开发、脚本编写等领域广受欢迎。Lua 中的协同程序(coroutine)是其并发编程的核心特性之一。协同程序提供了一种不同于多线程的并发执行方式,它允许多个代码段交替执行,而不是同时执行。这种机制…...
NASA:ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型,以及相关的大气数据
目录 简介 信息 代码 引用 网址推荐 知识星球 机器学习 MISR L2 FIRSTLOOK Aerosol Product subset for the ARCTAS region V001 简介 这是 ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型,以及相关的大气数据,…...
go clean command
文章目录 1.简介2.格式3.选项4.示例5.应用场景6.小结参考文献 1.简介 在 Go 语言的开发过程中,管理依赖和构建缓存是非常重要的。随着项目的迭代,旧的缓存和不再需要的依赖可能会影响构建的效率和准确性。 Go 提供了一个非常实用的命令 go clean&#…...
鸿蒙NEXT开发-动画(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
HTML 入门
1. 什么是 HTML HTML(Hyper Text Markup Language),超文本标记语言 超文本:比文本要强大,通过链接和交互方式来组织和呈现信息的文本形式,不仅有文本,还可能包含图片、音频、或者自己已经审阅…...
前端面试题(十五)
83. ES6 中的 let 和 const let 和 const 的区别是什么? let 和 const 是 ES6 引入的用于声明变量的新方式,相比于传统的 var,它们具有以下特性: 块级作用域:let 和 const 声明的变量在其所在的块级作用域内有效&…...
如何成为 Rust 核心贡献者?Rust 开发的核心是什么?Rust 重要技术专家揭秘
10 月 17 - 18日,由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会,本次活动邀请了 60 多位国际开源专家,汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…...
springboot + nacos + sofarpc 整合后报错403
springboot版本 2.2.2 nacos 版本 1.4.2 rpc-sofa-boot 版本 3.2.0 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent>…...
小米路由器R3Gv2安装openwrt记录
前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致,但bootloader有所不同,因此openwrt的固件不要互刷。另外,R3Gv2和R3G、4A百兆版是不同的设备,切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU:…...
记录一下,android studio 登录不上github的问题
android studio 2023.3.1.18 版本的编译器,出现问题,之前连接过的项目可以正常提交和拉取到github。 但是新建立的项目无法上传到github,提示错误cannot load information for github.com/:request response;access to this site,…...
springcloud之基于github webhook动态刷新服务配置
前言 在实际开发中经常会有一个叫做配置中心的服务,这个服务经过变更参数来动态刷新线上业务数据行为配置。比如;行为开关、活动数据、黑白名单、本地/预发/线上环境切换等等,这些配置信息往往需要在我们不重启系统的时候就可以被更新执行。那…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
