Spring Boot单元测试实战指南:从零到高效测试
在Spring Boot开发中,单元测试是保障代码质量的核心环节。本文将基于实际开发场景,手把手教你如何快速实现分层测试、模拟依赖、编写高效断言,并分享最佳实践!
一、5分钟环境搭建
-
添加依赖
在pom.xml中引入spring-boot-starter-test,默认集成JUnit 5、Mockito、AssertJ等工具:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> -
测试类模板
测试类通常放在src/test/java目录,命名规范为被测试类名 + Test。基础模板如下:@SpringBootTest // 加载Spring上下文(适合集成测试) @ExtendWith(SpringExtension.class) // JUnit 5注解 class UserServiceTest {@Autowiredprivate UserService userService;// 测试方法... }
二、分层测试:精准覆盖每一层
1. Service层测试:Mock依赖
场景:测试业务逻辑,隔离外部依赖(如数据库、第三方接口)。
工具:@MockBean模拟Spring管理的Bean。
@SpringBootTest
class UserServiceTest {@Autowiredprivate UserService userService;@MockBean // 模拟Repository依赖private UserRepository userRepository;@Testvoid testGetUserById() {// 1. 定义Mock行为when(userRepository.findById(1L)).thenReturn(Optional.of(new User("Alice")));// 2. 调用方法User user = userService.getUserById(1L);// 3. 断言结果assertThat(user.getName()).isEqualTo("Alice");}
}
2. Controller层测试:MockMvc模拟HTTP请求
工具:@WebMvcTest仅加载Web层组件,搭配MockMvc模拟请求。
@WebMvcTest(UserController.class) // 仅初始化Web层
class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserService userService;@Testvoid testGetUser() throws Exception {when(userService.getUserById(1L)).thenReturn(new User("Alice"));// 模拟GET请求并验证响应mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Alice"));}
}
3. 持久层测试:真实数据库操作
工具:@DataJpaTest(JPA)或@DataMongoTest(MongoDB)。
@DataJpaTest // 仅加载JPA组件,默认使用H2内存数据库
class UserRepositoryTest {@Autowiredprivate UserRepository userRepository;@Testvoid testSaveUser() {User user = new User("Bob");User savedUser = userRepository.save(user);// 验证ID自动生成assertThat(savedUser.getId()).isNotNull();}
}
三、测试进阶技巧
1. 参数化测试:覆盖多场景
使用@ParameterizedTest快速测试多组输入:
@ParameterizedTest
@ValueSource(ints = {1, 3, 5, -1}) // 测试奇数和边界值
void testIsOdd(int number) {assertTrue(number % 2 != 0);
}
2. 测试生命周期控制
• @BeforeEach:每个测试方法前执行(如初始化数据)。
• @AfterEach:每个测试方法后执行(如清理数据库)。
@BeforeEach
void setup() {userRepository.deleteAll();userRepository.save(new User("TestUser"));
}
3. 测试专用配置
通过@TestPropertySource加载测试配置文件:
@SpringBootTest
@TestPropertySource(locations = "classpath:test.properties")
class MyTest {// 使用test.properties中的配置
}
四、最佳实践与避坑指南
-
分层策略
• 单元测试:聚焦单一类,用@MockBean隔离外部依赖。• 集成测试:使用
@SpringBootTest验证组件交互。• Web层测试:优先用
@WebMvcTest而非启动完整应用。 -
断言工具选择
• AssertJ(推荐):链式断言更直观。assertThat(userList).hasSize(3).extracting("name").contains("Alice", "Bob"); -
环境隔离
• 使用H2内存数据库替代生产库。• 用
@MockBean模拟外部服务(如支付接口)。 -
测试数据管理
• @Sql注解:运行前执行SQL脚本初始化数据。@Test @Sql("/init-user-data.sql") void testUserCount() {assertThat(userRepository.count()).isEqualTo(5); }
五、快速运行测试
• IDE操作:右键测试类 → Run as JUnit Test。
• 命令行运行:
mvn test # Maven
./gradlew test # Gradle
总结
单元测试不是负担,而是高效开发的基石。通过分层测试、精准Mock和高效断言,可以大幅提升代码可靠性。立即动手,为你的Spring Boot项目加上“安全锁”吧!
新时代农民工
相关文章:
Spring Boot单元测试实战指南:从零到高效测试
在Spring Boot开发中,单元测试是保障代码质量的核心环节。本文将基于实际开发场景,手把手教你如何快速实现分层测试、模拟依赖、编写高效断言,并分享最佳实践! 一、5分钟环境搭建 添加依赖 在pom.xml中引入spring-boot-starter-te…...
5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍
MvvmLight、CommunityToolkit.Mvvm是开源包,他们为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。 本文介绍如下: 一、使用(旧)的MvvmLight库 其特点如下,要继承的基类是ViewModelBase;且使用…...
Dbeaver 执行 SQL 语句和执行 SQL 脚本的区别
执行 SQL 语句 执行 SQL 语句对应图标: 适用于执行单个 SQL 的情形,默认是在光标处或选中的文本上执行 SQL 查询。 实际上同时选择多个 SQL 并通过该方式去执行也可能成功,只是有失败的风险。因此不建议使用它来同时执行多个 SQL 语句。 情况…...
《Python3网络爬虫开发实战(第二版)》配套案例 spa6
Scrape | Moviehttps://spa6.scrape.center/ 请求影片列表api时,不仅有分页参数,还多了一个token,通过重发请求发现token有时间限制,所以得逆向token的生成代码。 通过xhr断点定位到接口请求位置 刷新页面或者点翻页按钮&#x…...
AWS 中国区 CloudFront SSL 证书到期更换实战指南
适用场景: AWS 中国区(宁夏区域 cn-northwest-1 或北京区域 cn-north-1)CloudFront 分配的 SSL 证书到期后无缝替换,域名主体为 domain.cn。 背景与痛点 当 CloudFront 使用的 SSL 证书即将到期时,需手动替换新证书以避免服务中断。由于 AWS 中国区 不支持 ACM 证书,必须…...
Python基础语法:字面量,注释,关键字,标识符,变量和引用,程序执行的3大流程
目录 字面量(数据的类型) 字面量的含义 常见字面量类型(6种) 输出各类字面量(print语句) 注释(单行和多行注释) 注释的作用 单行注释和多行注释 单行注释(ctrl/&a…...
SPL 量化 获取数据
下载数据 我们将股票数据分享在百度网盘上供下载,每工作日更新。 目前可供下载的数据有 A 股的日 K 线数据、股票代码列表和上市公司的基本面数据 下载链接: 百度网盘 下载数据的文件格式为 btx,是 SPL 的特有二进制格式。 btx 称为集文…...
VMware与Docker:虚拟化技术的双轨演进与融合实践
一、虚拟化的本质与价值重构 虚拟化(Virtualization)是通过软件抽象层将物理资源转化为可动态分配的虚拟单元,其核心价值在于打破"一机一用"的刚性架构,实现三大突破性转变: 资源解耦:硬件资源…...
3. pandas笔记之:创建
以下是 Pandas 主要数据结构的创建方式整理,涵盖 Series 和 DataFrame 的常见创建方法: 一、Series 创建方式 从列表/数组创建 import pandas as pd import numpy as np# 基础列表 s1 pd.Series([1, 3, 5, np.nan, 6])# 指定索引 s2 pd.Series([10, …...
潞晨科技将暂停DeepSeek API服务,AI大模型技术红利普惠化与市场竞争白热化叠加,内卷恶果,开始显现!
潞晨科技宣布暂停DeepSeek API服务的事件,不仅暴露了AI大模型行业的技术与成本博弈,更折射出国内AI生态中中小企业的生存困境和行业内卷的深层矛盾。这一事件背后,既有企业个体商业模式的局限性,也揭示了整个行业在技术迭代、成本控制和市场策略上的系统性挑战。 一、潞晨科…...
某大型电解铝厂电解系统谐波治理装置改造沃伦森电气
电解铝行业谐波治理解决方案——无源滤波装置优化升级,保障稳定运行 在电解铝生产过程中,谐波污染问题严重影响电网电能质量,甚至可能导致滤波装置损坏,引发群爆事故。河南登封某大型电解铝厂通过无源滤波装置智能化改造ÿ…...
Rust 学习笔记:安装 Rust
Rust 学习笔记:安装 Rust Rust 学习笔记:安装 Rust在 Windows 上安装 Rust命令行创建 Rust 项目在 Mac/Linux 上安装 Rust一些命令升级卸载cargo -hrustc -h 安装 RustRoverrust-analyzer Rust 学习笔记:安装 Rust 在 Windows 上安装 Rust …...
精准落地设计,现代项目管理中的深度实践
在数字化转型浪潮席卷全球的当下,项目管理的复杂性呈指数级增长。无论是软件开发、大型工程建设,还是企业流程再造,都面临着设计理念与实际执行之间的鸿沟。《人月神话》第6章中关于确保体系结构师设计准确落地的论述,为破解这一难…...
编译 C++ 报错“找不到 g++ 编译器”的终极解决方案(含 Windows/Linux/macOS)
前言 在使用终端编译 C 程序时,报错: 或类似提示,意味着你的系统尚未正确安装或配置 g 编译器。本篇将从零手把手教你在 Windows / Linux / macOS 下安装并配置 g,适用于新手或 C 入门阶段的你。 什么是 g? g 是 GN…...
联易融出席深圳链主企业供应链金融座谈会,加速对接票交所系统
近日,深圳市委金融办组织召开全市链主企业供应链金融高质量发展座谈会。联易融作为供应链金融企业代表,与虾皮信息科技、电子元器件和集成电路国际交易中心等代表性机构以及行业协会、金融机构参加了会议。 发展供应链金融是破解中小微企业融资难、融资…...
html单页业务介绍源码
源码介绍 html单页业务介绍源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行 效果预览 源码免费获取 html单页业务介绍源码...
单体OJ项目
单体项目版本、微服务版还需我再钻研钻研。 项目介绍 在系统前台,管理员可以创建、管理题目;用户可以自由搜索题目、阅读题目、编写并提交代码。 在系统后端,能够根据管理员设定的题目测试用例在代码沙箱 中对代码进行编译、运行、判断输出是否正确。 其…...
豆包桌面版 1.47.4 可做浏览器,免安装绿色版
自己动手升级更新办法: 下载新版本后安装,把 C:\Users\用户名\AppData\Local\Doubao\Application 文件夹的文件,拷贝替换 DoubaoPortable\App\Doubao 文件夹的文件,就升级成功了。 再把安装的豆包彻底卸载就可以。 桌面版比网页版…...
数据分析案例:医疗健康数据分析
目录 数据分析案例:医疗健康数据分析1. 项目背景2. 数据加载与预处理2.1 加载数据2.2 数据清洗3. 探索性数据分析(EDA)3.1 再入院率概览3.2 按年龄分组的再入院率3.3 住院时长与再入院4. 特征工程与可视化5. 模型构建与评估5.1 数据划分5.2 训练逻辑回归5.3 模型评估6. 业务…...
【MySQL】索引失效问题详解
目录 1. 最左前缀原则 2. 条件左边有函数或运算 3. 隐式类型转换 4. LIKE 模糊查询以 % 开头 5、MySQL 优化器选择全表扫描 ⭐对 in 关键字特别说明⭐ (1)列表太大时,走全表扫描了 (2)隐式类型转换 ÿ…...
Qt实现语言切换的完整方案
在Qt中实现语言动态切换需要以下几个关键步骤,我将提供一个完整的实现方案: 一、准备工作 在代码中使用tr()标记所有需要翻译的字符串 cpp button->setText(tr("Submit")); 创建翻译文件 在.pro文件中添加: qmake TRANSLATION…...
MongoDB(docker版)备份还原
docker启动MongoDB docker run -d -p 27017:27017 --name my-mongo -v /mongodb/db:/data/db mongo备份MongoDB 使用mongodump备份数据库时,默认会将备份数据保存在当前工作目录下的dump文件夹中。 docker容器中默认备份在当前工作目录,所以此处指定当…...
优选算法第十讲:字符串
优选算法第十讲:字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘...
【扣子Coze 智能体案例四】五行八卦占卜智能体
目录 一、意图识别 二、时间格式转换 三、八字转换 四、八字提取 五、八字提取2 六、数据汇总 七、统计五行占比 八、雷达图生成 九、表格生成 十、AI占卜 十一、结束节点 一、意图识别 用户输入的信息包含各种时间格式的年月日时 用户输入的信息包含天干地支八字…...
2026《数据结构》考研复习笔记四(绪论)
绪论 前言时间复杂度分析 前言 由于先前笔者花费约一周时间将王道《数据结构》知识点大致过了一遍,圈画下来疑难知识点,有了大致的知识框架,现在的任务就是将知识点逐个理解透彻,并将leetcode刷题与课后刷题相结合。因此此后的过…...
域名 → IP 的解析全过程
Question 使用 iOS 的网络库 (比如 AFNetwoking, URLSession, Alamofire) 进行请求时, 域名具体是怎样被解析为 IP 地址的 ? Answer 一次常见的 URLSession / AFNetworking / Alamofire 请求,域名 → IP 的解析全过程 拆成自顶向下 6 个环节, 如下 1 ► 应用层&…...
C++学习:六个月从基础到就业——STL算法(三)—— 数值算法(上)
C学习:六个月从基础到就业——STL算法(三)—— 数值算法(上) 本文是我C学习之旅系列的第二十七篇技术文章,也是第二阶段"C进阶特性"的第五篇,主要介绍C STL算法库中的数值算法(上部分)。查看完整系列目录了解…...
路由与路由器
路由的概念 路由是指在网络通讯中,从源设备到目标设备路径的选择过程。路由器是实现这一过程的关键设备,它通过转发数据包来实现网络的互联。路由工作在OSI参考模型的第三层,‘网络层’。 路由器的基本原理 路由器通过维护一张路由表来决定…...
5.学习笔记-SpringMVC(P61-P70)
SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1)在SpringConfig.java,开启注解,是事务驱动 2)配置事务管理器(因为事务管理器是要配置数据源对象&…...
【专题刷题】二分查找(一):深度解刨二分思想和二分模板
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
