SpringBoot JUnit 教程

发布时间:2026/8/28 13:11:43

SpringBoot JUnit 教程
1. 核心依赖 (Maven)dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency该 Starter 自动引入JUnit 5(Jupiter)MockitoAssertJSpring Test等2. 基础注解注解作用SpringBootTest启动完整 Spring 上下文集成测试Test标记测试方法BeforeEach/AfterEach每个测试前/后执行BeforeAll/AfterAll所有测试前/后执行需静态方法DisplayName给测试起中文名Disabled禁用测试3. 单元测试Service 层被测 ServiceService public class UserService { public String getUserName(Long id) { return user- id; } }测试类SpringBootTest class UserServiceTest { Autowired private UserService userService; Test DisplayName(根据ID获取用户名) void testGetUserName() { String name userService.getUserName(1L); assertEquals(user-1, name); assertNotNull(name); } }4. Web 层测试Controller使用WebMvcTest只加载 Web 层比SpringBootTest轻量。被测 ControllerRestController RequestMapping(/api/users) public class UserController { GetMapping(/{id}) public String getUser(PathVariable Long id) { return user- id; } }测试类WebMvcTest(UserController.class) class UserControllerTest { Autowired private MockMvc mockMvc; Test void testGetUser() throws Exception { mockMvc.perform(get(/api/users/1)) .andExpect(status().isOk()) .andExpect(content().string(user-1)); } }5. Mock 依赖隔离测试使用MockBean模拟 Service避免依赖真实数据库。SpringBootTest class UserControllerMockTest { Autowired private MockMvc mockMvc; MockBean private UserService userService; Test void testGetUser() throws Exception { when(userService.getUserName(1L)).thenReturn(mock-user); mockMvc.perform(get(/api/users/1)) .andExpect(status().isOk()) .andExpect(content().string(mock-user)); } }6. 数据层测试Repository使用DataJpaTest测试 JPA默认回滚事务。DataJpaTest class UserRepositoryTest { Autowired private UserRepository userRepository; Test void testSaveAndFind() { User user new User(test); userRepository.save(user); OptionalUser found userRepository.findByName(test); assertTrue(found.isPresent()); } }7. 断言进阶AssertJimport static org.assertj.core.api.Assertions.*; assertThat(user.getName()).startsWith(user); assertThat(list).hasSize(3).contains(a, b);8. 测试生命周期TestInstance(TestInstance.Lifecycle.PER_CLASS) class LifecycleTest { BeforeAll void initAll() { /* 无需 static */ } }9. 常用 Mockito 操作// 验证调用次数 verify(userService, times(1)).getUserName(anyLong()); // 抛出异常 when(userService.getUserName(1L)).thenThrow(new RuntimeException(error)); // 参数匹配 when(userService.getUserName(eq(1L))).thenReturn(user-1);10. 测试覆盖率 (Jacoco)plugin groupIdorg.jacoco/groupId artifactIdjacoco-maven-plugin/artifactId version0.8.11/version /plugin执行mvn clean test后生成target/site/jacoco/index.html。11. 最佳实践总结类型推荐注解说明单元测试ServiceSpringBootTest可配合MockBeanWeb 层测试WebMvcTest只加载 ControllerRepository 测试DataJpaTest轻量自动回滚集成测试SpringBootTest加载完整上下文测试命名should_xxx_when_xxx清晰表达意图断言AssertJ更丰富流畅12. 面试常见问题SpringBootTest和WebMvcTest区别SpringBootTest加载全部 Bean适合集成测试。WebMvcTest只加载 Web 层更快。MockBean和Mock区别MockBean是 Spring 提供的会将 Mock 对象注入 Spring 容器。Mock是 Mockito 的不管理容器。如何测试异步方法使用AsyncCountDownLatch或CompletableFuture配合await()。

相关新闻

JQuery Tips(4)----一些关于提高JQuery性能的Tips

JQuery Tips(4)----一些关于提高JQuery性能的Tips

2026/8/25 21:33:36

在选择时&#xff0c;最好以ID选择符作为开头我想这个很好理解&#xff0c;因为JQuery内部使用document.getElementByID方法进行ID选择&#xff0c;这种方法比其他所有对DOM选择的方法更快&#xff0c;所以以$("#")开头是最好的,比如:<div id"a"><…

尽量减少对DOM的操作

尽量减少对DOM的操作

2026/8/25 23:26:58

在页面中对DOM操作是比较消耗的&#xff08;比如在页面插入或删除一段文字&#xff09;&#xff0c;把这个改动降至最小是保持性能的最佳实践&#xff01;比如&#xff1a;<ul id"test"></ul><script type"text/javascript">var $list …

从零搭建一个单节点 K8S 可观测实验室(一):从 Ubuntu 24.04 开始

从零搭建一个单节点 K8S 可观测实验室(一):从 Ubuntu 24.04 开始

2026/8/26 5:08:15

最近准备把前段时间自己搭过的一套环境整理成系列文章&#xff1a;从零搭建一个单节点 K8S 可观测实验室。这个系列不是为了搭一个生产级 Kubernetes 集群&#xff0c;也不是为了追求复杂架构&#xff0c;而是想从一台普通的本地虚拟机开始&#xff0c;逐步搭出一个可以长期使用…

AI产业链拆解:算力、模型、平台与应用层的盈利机会与工程实践

AI产业链拆解:算力、模型、平台与应用层的盈利机会与工程实践

2026/8/28 16:09:16

2024 年至今&#xff0c;身边讨论 AI 的人越来越多。但比起“大模型又能写诗了”“哪个 Agent 又上线了”&#xff0c;办公室里更常听到的其实是另一句&#xff1a; AI 这么火&#xff0c;钱到底被谁赚走了&#xff1f; 这个问题看似是个商业话题&#xff0c;但对于做技术的…

Python量化复盘:事件驱动低吸策略与AI再平衡实战

Python量化复盘:事件驱动低吸策略与AI再平衡实战

2026/8/28 16:09:16

在过去一年的投资复盘工作中&#xff0c;我遇到一个比较典型的问题&#xff1a;市场出现系统性下跌时&#xff0c;按照“事件驱动型低吸”思路买入的资产&#xff0c;到一年后到底赚没赚钱&#xff1f;如果同期把仓位重新分配到 AI 相关方向&#xff0c;收益结构又会有怎样的变…

基于C#与VS2019的气象数据处理桌面工具开发实战

基于C#与VS2019的气象数据处理桌面工具开发实战

2026/8/28 16:09:16

简介&#xff1a;数据处理是科研与工程实践中的基础环节&#xff0c;涉及数据清洗、格式转换与信息关联等核心原理。通过自动化工具实现数据处理&#xff0c;能显著提升工作效率、减少人为错误&#xff0c;其技术价值在于将复杂操作封装为直观应用。在气象、地理信息等领域&…

海康工业相机C#开发实战:从SDK配置到图像采集的完整指南

海康工业相机C#开发实战:从SDK配置到图像采集的完整指南

2026/8/28 16:09:16

简介&#xff1a;在机器视觉和工业自动化领域&#xff0c;工业相机是实现图像采集的核心硬件设备。其工作原理是通过传感器将光信号转换为数字图像数据&#xff0c;再通过特定的通信接口&#xff08;如GigE或USB3.0&#xff09;传输至上位机。这项技术的价值在于为质量检测、定…

端侧AI Agent实战:LFM2.5-2.6B本地部署与工具调用

端侧AI Agent实战:LFM2.5-2.6B本地部署与工具调用

2026/8/28 16:09:16

LFM2.5-2.6B&#xff0c;单看命名就能拆出三层信息&#xff1a;LFM 是模型系列名&#xff0c;2.5 是版本号&#xff0c;2.6B 表示 26 亿参数。再配上标题里的 On-Device Agents&#xff0c;定位非常直接——这是一个面向端侧设备运行的小参数智能体模型。它想解决的问题不是“大…

从平台到 SQL 控制台,理清 SAP HANA Cloud 五大管理与开发工具的职责边界

从平台到 SQL 控制台,理清 SAP HANA Cloud 五大管理与开发工具的职责边界

2026/8/28 15:59:15

真正开始维护 SAP HANA Cloud 以后,很快就会遇到一个看似简单、实际特别容易混淆的问题。 同样是在浏览器里打开一个 SAP 页面,有时我们进入 SAP BTP cockpit,有时进入 SAP HANA Cloud Central,有时又跳到 SAP HANA cockpit。准备查看一张数据库表时,页面又把我们带到 SA…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

基于Claude Code的开源AI求职框架:从职位搜索到Offer的全自动化闭环

基于Claude Code的开源AI求职框架:从职位搜索到Offer的全自动化闭环

2026/8/28 0:08:32

当AI助手能够独立完成从职位匹配、简历定制到面试准备的全链路求职流程时&#xff0c;求职不再是一场信息战&#xff0c;而是一场工程化战役。框架概述&#xff1a;本地运行的AI求职引擎这是一个构建在Claude Code之上的开源AI求职框架&#xff0c;核心理念是"在工作者的机…

Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复

Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复

2026/8/28 0:08:32

1. 问题现象 在 Godot 4 仿 agar.io 的 2D 项目中&#xff0c;相机缩放设计为「由球组整体尺寸决定」&#xff0c;世界可见高度恒定&#xff0c;窗口只作为视口裁剪。默认小窗口 1280x720 时相机高度正常&#xff1b;但窗口最大化到 2940x1912 后&#xff0c;视角被明显拉远、…

从软件测试大赛到实战:Java+Selenium自动化测试进阶指南

从软件测试大赛到实战:Java+Selenium自动化测试进阶指南

2026/8/28 0:08:32

1. 缘起&#xff1a;从校园到赛场&#xff0c;我的软件测试之路几年前&#xff0c;我还是一个在校园里对着Java课本和“Hello World”程序挠头的普通学生。软件测试对我来说&#xff0c;只是一个在开发流程末尾、用鼠标点点按钮的模糊概念。直到我偶然在学校的公告栏上看到了“…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…