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动态刷新服务配置
前言 在实际开发中经常会有一个叫做配置中心的服务,这个服务经过变更参数来动态刷新线上业务数据行为配置。比如;行为开关、活动数据、黑白名单、本地/预发/线上环境切换等等,这些配置信息往往需要在我们不重启系统的时候就可以被更新执行。那…...

qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形
1 首先qt 已经封装了opengl,那么我们就可以直接用了,这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…...

【动态规划】子数组系列(下)
1. 等差数列划分 413. 等差数列划分 状态表示:以 i 位置为结尾时的等差数列的个数 状态转移方程:由于至少需要三个元素才符合题目中等差数列的要求,所以需要判断 i - 2,i - 1,i 三个元素,当这三个元素符合…...

macos mendeley Unable to install the Microsoft Word Plugin 解决
windows也是相似的原理,这里主要说macos, 本质是 找到mendeley的插件启动项,放在word启动目录下, GPT-o1的解决方案: 3. Manual Installation (If Automatic Installation Fails) If the automatic installation doe…...

【Linux进程间通信】Linux信号机制深度解析:保存与处理技巧
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux进程间通信 📒1. 信号的保存🌊在内核中的表示🍂sigs…...

常见开源组件的详解
文章目录 RPCRPC架构和工作流程为什么有了HTTP还要用RPC底层协议数据格式连接管理错误处理 使用场景常见的RPC框架 Web应用框架主要功能常见的Web应用框架Spring Boot (Java)Django (Python)Express.js (Node.js) Redis主要特点应用场景缓存问题Redis集群架构主从复制Redis Clu…...

rust使用教程详解
欢迎来到 Rustlings。该项目包含一些小练习,让您习惯阅读和编写 Rust 代码。这包括阅读和响应编译器消息! 建议在阅读Rust 官方书籍(学习 Rust 最全面的资源)的同时做 Rustlings 练习 📚️ Rust By Example是另一个推…...
并查集的实现(朴素版)
这是C算法基础-数据结构专栏的第二十九篇文章,专栏详情请见此处。 由于作者即将参加CSP,所以到比赛结束前将不再发表文章! 引入 并查集是一种可以快速合并查找集合的一种数据结构,这次我们将通过三道题来详细讲解并查集ÿ…...

WPF 为button动态设置不同的模板
有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容,比如Button未点击安装显示: 安装后显示: 可以通过设置button的content,通过content来设置不同的模板来实现功能,以下是代码: MainWi…...

【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917
本文涉及知识点 C贪心 反证法 决策包容性 CDFS LeetCode2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子…...

虚幻引擎GAS入门学习笔记(一)
虚幻引擎GAS入门(一) Gameplay Ability System(GAS) 是一个模块化且强大的框架,用于管理虚幻引擎中的游戏玩法逻辑。它的核心组成部分包括 Gameplay Ability(定义和执行能力)、Gameplay Effect(应用和管理…...