当前位置: 首页 > article >正文

SpringBoot单元测试实战:Mock技术全解析

在 Spring Boot 中整合 Mock模拟 主要用于单元测试和集成测试目的是隔离被测组件避免依赖真实外部服务如数据库、HTTP 接口、文件系统等。Spring Boot 提供了强大的测试支持结合 JUnit 5 Mockito Spring Test 可以轻松实现。什么是 mock 测试在测试某个组件被测对象时用“假的”模拟的对象来替代它的真实依赖从而隔离外部干扰专注于验证该组件自身的逻辑是否正确。比如说你要测试“用户登录”功能if (userService.checkPassword(username, password)) { return 登录成功; } else { return 密码错误; }但userService.checkPassword()会去查真实数据库。在 Mock 测试中你告诉程序“别查数据库了我直接告诉你当用户名是 ‘张三’、密码是 ‘123’ 时假装返回 true。”这样不用连数据库不用准备真实账号1 毫秒就测完还能测试“密码错误”“用户不存在”等各种情况快速上手引入依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency直接看示例代码Service public class UserService { Autowired private UserRepository userRepository; // ← 要被 mock 的依赖 public String getUserName(Long id) { User user userRepository.findById(id); return user ! null ? user.getName() : Unknown; } }Component public class UserRepository { public User findById(Long id) { // 真实项目可能查数据库 throw new UnsupportedOperationException(Not implemented); } }ExtendWith(MockitoExtension.class) // 启用 Mockito class UserServiceUnitTest { Mock private UserRepository userRepository; InjectMocks private UserService userService new UserService(); // 手动创建 Test void testGetUserName() { // 打桩 模拟调用接口或方法的返回值跳过执行具体的逻辑 when(userRepository.findById(1L)).thenReturn(new User(1L, Bob)); // 调用 String name userService.getUserName(1L); // 断言 assertEquals(Bob, name); } }知识讲解常见注解ExtendWith(MockitoExtension.class)启用 Mockito 的自动 Mock 功能如 Mock, InjectMocks。MockMock注解用于创建一个模拟mock对象。这个对象是你想要模拟的类的实例你可以为这个对象的方法定义预期的行为比如指定方法的返回值或模拟方法抛出异常。需要和InjectMocks配合使用。InjectMocksInjectMocks是 Mockito 框架提供的一个非常常用的注解主要用于自动将用Mock或Spy创建的模拟对象mocks/spies注入到被测试的类即“待测对象”中。类似于 spring 的依赖注入只不过这里注入的是假的对象不会真正执行代码。Mock private MyDependency myDependency; InjectMocks private MyClass myClass; // myDependency 被注入到 myClass Test public void testMethod() { when(myDependency.performAction()).thenReturn(result); assertEquals(result, myClass.useDependency()); }SpySpyMockito提供的一个注解用于创建部分 Mock 对象Partial Mock。在Spring Boot单元测试中它允许对象的真实方法继续执行但可以选择性地 Mock 某些方法。简单理解Mock → 所有方法都是假的 Spy → 默认执行真实方法可以局部伪造Stubbing打桩指 预先设定某个依赖对象通常是 mock 对象在特定调用时的返回值或行为从而隔离被测代码与其他模块的耦合。主要有这两种方式doReturn(...).when(mock)用于 void 方法或 spywhen(mock.method()).thenReturn(...)用于普通方法的语法// 用 when(...).thenReturn(...) , when(mock.method()).thenReturn(...) 或 doThrow(...) 等方式预先告诉 Mockito // “当这个方法被调用时请返回 XX / 抛出 YY”。 when(userRepository.findById(1L)).thenReturn(new User(Alice));tips:如果 Mock 对象的方法被调用了但你没有“打桩”stubbing会发生什么Mockito 会返回该方法的“默认值”default value而不会报错。但这个“默认值”可能不是你想要的甚至会导致后续逻辑出错比如 NullPointerException。如果你对 Mock 对象的方法进行了预设Stubbing例如使用when(...).thenReturn(...)但在测试执行完毕后该方法没有被实际调用Mockito 默认会抛出UnnecessaryStubbingException异常。返回类型默认返回值void什么都不做静默通过基本类型int,boolean等0,false对象类型String,User,List等null集合List,Map等空集合如Collections.emptyList()OptionalTOptional.empty()Verification验证verify()方法验证在测试过程中xxx 类 . xxx 方法(...)这个方法是否被调用过。//使用 verify(类名).方法名(any());注意verify()本身没有“输出”它只有两种行为如果方法确实被调用了 → 测试继续执行无任何提示静默通过如果方法没被调用或参数不匹配 → 抛出WantedButNotInvoked异常测试失败所以只要你的测试方法跑完了、没报错就说明 verify 成功了参数匹配器写法含义注意事项any()匹配 任意非 null 对象类型由方法签名推断不能匹配nullany(Class)明确指定类型如any(String.class)推荐使用更清晰安全anyString()等价于any(String.class)仅用于StringanyInt(),anyLong()等用于基本类型包装类如anyInt()→IntegerisNull()/isNotNull()显式匹配 null 或非 null当需要处理 null 时用单元测试最佳实践实际开发中推荐遵循AAA 模式Arrange 准备数据 Act 执行测试 Assert 断言结果示例Test void testGetUser(){ // Arrange User user new User(1L,Tom); Mockito.when(userService.getUserById(1L)).thenReturn(user); // Act User result userService.getUserById(1L); // Assert Assertions.assertEquals(Tom,result.getName()); }

相关文章:

SpringBoot单元测试实战:Mock技术全解析

在 Spring Boot 中整合 Mock(模拟) 主要用于单元测试和集成测试,目的是隔离被测组件,避免依赖真实外部服务(如数据库、HTTP 接口、文件系统等)。Spring Boot 提供了强大的测试支持,结合 JUnit 5…...

239 滑动窗口最大值

题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], k 3…...

大模型连载8:词向量如何表示近义词?

余弦相似度和欧式距离 既然我们将 token 都转换到了高维的数学空间中,那么在高维数学空间中,如何来衡量两个 token (高维空间中为向量)的含义是相似的,还是相反的呢? 比如,在人类的认知中&…...

计算机毕业设计之springboot北工国际健身俱乐部

本系统为会员而设计制作北工国际健身俱乐部,旨在实现北工国际健身俱乐部智能化、现代化管理。本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使…...

Day01笔记整理

java背景: java用于企业及应用开发,有JavaSE(基本)、JavaEE(企业)、JavaME(小型)三大技术平台。 jdk 1、jdk中的java语句运用: 在jdk安装目录的bin下,存在…...

计算机毕业设计之springboot基于宠物饲养管理APP的设计与实现

宠物饲养管理APP设计的目的是为用户提供宠物信息、年龄段、饮食信息、生活习惯等方面的平台。与PC端应用程序相比,宠物饲养管理APP的设计主要面向于宠物店,旨在为管理员和用户提供一个宠物饲养管理APP。用户可以通过APP及时查看宠物信息等。宠物饲养管理…...

AI原生应用领域意图识别的发展现状与未来展望

AI原生应用的"心灵翻译官":意图识别的进化之路与未来图景 关键词 意图识别、AI原生应用、自然语言理解、多模态交互、大模型微调、小样本学习、可解释性AI 摘要 在AI原生应用(AI-Native Apps)的世界里,意图识别就像…...

DVWA 搭建踩坑全记录:卡在 “Invalid database selected” 最后一关(新手求助!Help)

环境:Windows 10 phpStudy v8.1 MySQL 5.7.26 DVWA 最新版已做操作:1. phpStudy 安装成功,Apache 和 MySQL 都能启动 2. MySQL 命令行能连上(root 密码空) 3. DVWA 文件放在 WWW 下,config.inc.php 已创建并…...

华为OD机考双机位C卷 - 智能驾驶(Java Python JS GO C++ C)

智能驾驶 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷) 题目描述 有一辆汽车需要从 m * n 的地图左上角(起点)开往地图的右下角(终…...

不懂代码,我用AI编程给5岁女儿开发了个流光画板(带你一步一步设计一个属于自己的流光画板)

我女儿经常玩的一个画板APP,但是经常弹广告。恰巧看到某家大模型说一句话生成一个画板,抠门的我想着AI编程不是说自己很厉害吗,我就用AI编程尝试去写一个。 靠着记忆让AI生成一个画板html,期初提示词比较笼统“帮我设计一个画板&a…...

数据即资产,安全即底线——企业资产数据安全控制管理的全维度实践与未来展望

在数字经济深度渗透的今天,数据已成为企业核心战略资产,是驱动业务创新、提升核心竞争力的关键引擎。从客户信息、财务数据到核心技术文档、商业秘密,数据的流转与应用贯穿企业运营全链条,但与此同时,数据泄露、篡改、…...

2026最新 springboot+vue邯郸特产交易平台

文章目录前言源码获取(稀缺资源,尽快转存到自己网盘,防止失效)详细视频演示技术栈后端技术前端技术功能模块后台管理端管理员功能商家功能具体实现截图后端框架SpringBoot前端框架Vue持久层框架MyBaits成功系统案例:代…...

想要实现真正的认知自动化?企业智脑定制难道不是必经之路?

想要实现真正的认知自动化?企业智脑定制难道不是必经之路?在企业数字化转型的漫长征途中,我们曾寄希望于ERP系统理顺流程,寄希望于RPA(机器人流程自动化)替代重复劳动。然而,当大模型浪潮席卷全…...

OSPF4种网络类型分析-Broadcast/NBMA/P2MP/P2P

一、四种OSPF网络类型分析1. Broadcast(广播模式) 网络特点:支持广播通信,所有设备共享同一广播域(如以太网、VLAN)。 邻居建立:路由协议通过多播Hello包自动发现邻居,并选举DR&…...

HandBrake - 开源免费视频格式转换/压缩转码压制工具

无论是下载高清电影,还是用手机录制的视频,很多时候文件体积都非常巨大。收藏保存或分享时会比较麻烦,因此常备一款真正好用的免费视频压缩压制/格式转换软件是很有必要的。 网上视频处理工具非常繁多,收费免费的一大堆&#xff…...

基于javaweb和mysql的ssm+maven情缘图书馆管理系统(java+ssm+tomcat+maven+mysql)

基于javaweb和mysql的ssmmaven情缘图书馆管理系统(javassmtomcatmavenmysql) 私信源码获取及调试交流 私信源码获取及调试交流 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,…...

Winform Modbus 316线程 异步 λ表达式 泛型与数组 Encoding.ASCII.GetBytes bitConverter 大端小端 寄存器与label

this.Invoke 首先纠正:代码里不是List.Invoke,是**this.Invoke(this代表当前的FrmMain窗体对象),这是WinForm开发中跨线程更新UI的核心方法**,灯珠状态、仪表、图表这些UI控件的更新都靠它,下面…...

Hexo Butterfly 主题副标题不显示问题解决方案

问题描述 在 Hexo 根目录的 _config.yml 中配置了 subtitle,但网站没有显示副标题。 问题原因 配置位置错误! Butterfly 主题的副标题配置不在 Hexo 根目录的 _config.yml 中,而是在主题配置文件 themes/butterfly/_config.yml 中。 错误…...

深入解析MySQL数据库报错:`ERROR 1146 (42S02) Table ‘mysql.user‘ doesn‘t exist`

在安装或升级MySQL数据库时,你可能会遇到ERROR 1146 (42S02): Table mysql.user doesnt exist错误。这个错误表明尝试访问的mysql.user表不存在,这是MySQL用于存储用户账户和权限信息的关键系统表。本文将详细探讨这一错误的原因和解决方案,帮…...

带你轻松了解半导体CIM系统之AMHS (二)

👉带你轻松了解半导体CIM系统之AMHS (一) 话接上文,半导体AMHS系统是芯片制造晶圆厂中十分关键的系统,由搬运设备,存储与净化设备和控制系统组成。而在Fab(晶圆厂)中AMHS中的OHT也就是天车搬运十分繁忙&am…...

Android Studio 安装保姆级教程(mac版)

本文是一篇 从零开始的完整安装教程,适用于 Mac用户。 按照本文步骤操作,可以完成: 1:Android Studio 安装 2:Android SDK 配置 3:JDK 配置 4:Gradle 配置 5;Android 模拟器安装 6:第一个 Android 项目运行 一、下载 Android Studio 打…...

中小企业可用福尔蒂轻量化改性套件:含17种PA6/PBT配比+免费云端模拟

最近有位做汽车内饰件的朋友跟我聊起一个实际困扰:他们接了一个新项目,需要把传统PA6部件换成更轻、更耐热又不缩水的新材料,但试了几家供应商提供的改性料,不是注塑时流纹严重,就是批次间性能波动大,小批量…...

长亭 Xray Web 漏洞扫描器

长亭 Xray Web 漏洞扫描器 适用对象:安全研究人员、渗透测试工程师、开发人员、网络安全爱好者 前置知识:了解基本的 HTTP 协议、Web 安全概念(如 SQL 注入、XSS) 法律声明:本教程仅用于授权的安全测试、本地靶场练习…...

一次试样失败催生的技术革新:福尔蒂吹瓶专用ACR助剂逆向推演与流变拟合

那年夏天,一家饮料包装厂在调试新产线时遇到个棘手问题:吹瓶过程中频繁出现壁厚不均、肩部发白、甚至局部开裂——同一套模具、同一批PET切片、连温控参数都没动,就是反复试样失败。技术人员查了一周,最后把样本寄到了青岛福尔蒂新…...

国产替代:福尔蒂vs利安隆/金发/普立万在阻燃PC母粒的技术代差与应用边界

最近不少做工程塑料的朋友都在问一个问题:同样是阻燃PC母粒,为什么有些批次稳定性好、注塑不析出、火焰自熄快,而另一些却容易黄变、分散差、甚至过不了UL94 V-0测试?这个问题背后,其实不是简单的配方差异,…...

从0到1,一套系统搞定C端+B端+平台端

大家好,今天就带着大家,手把手拆解、搭建一套完整的 WiFi 连接小程序。不用复杂技术、不用冗余功能,严格围绕「用户连网、商家管理、平台广告」三大核心,从功能设计到页面逻辑,一步步讲清楚怎么搭建、每一步做什么。整…...

react-i18next 国际化支持

一、今日整体工作内容 今天完成的是做了国际化支持,实现中英文语言切换。首先看了官方的 API 文档,它支持不同的编辑器语言。然后我用 React Next 18 引入了相关包,自己维护了一个 locale 键值数组,对应中文和英文字段。 全文国际…...

2025 年全国大学生电子设计竞赛试题(C 题)——基于单目视觉的目标物测量装置

一、 任务 设计制作基于单目视觉的目标物测量装置,用于测量并显示基准线到目标物的距离 D(见说明)、目标物平面(简称物面)上几何图形的边长或直径 x,测量系统组成如图 1 所示。测量电路和单目摄像头组成测量…...

打造Spring Boot接口护盾:防重提交与限流秘籍

打造Spring Boot接口护盾:防重提交与限流秘籍 Spring Boot 接口那些 “糟心事” 在当今高并发的互联网应用场景下,Spring Boot 作为主流的 Java 开发框架,被广泛应用于构建各类后端服务。然而,随着业务的不断发展和用户量的增长&a…...

【JAVA学习思维导图】黑马程序员Java+AI智能辅助编程day03- 结构-Xmind思维导图

...