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动态刷新服务配置
前言 在实际开发中经常会有一个叫做配置中心的服务,这个服务经过变更参数来动态刷新线上业务数据行为配置。比如;行为开关、活动数据、黑白名单、本地/预发/线上环境切换等等,这些配置信息往往需要在我们不重启系统的时候就可以被更新执行。那…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...