SpringBoot JUnit 教程

发布时间:2026/7/11 16:54:37

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/7/11 15:18:18

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

尽量减少对DOM的操作

尽量减少对DOM的操作

2026/7/11 13:03:47

在页面中对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/7/10 16:40:27

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

Python中with open:不关文件?等着被OSError暴揍吧

Python中with open:不关文件?等着被OSError暴揍吧

2026/7/12 2:53:48

open() 函数内置函数使用来打开一个文件的open()函数, 会返回文件对象, 在对文件展开处理进程当中都得用到这个函数, 要是该文件没能成功被打开, 便会抛出。留意, 运用 open() 函数时, 务必要确保将文件对象关闭, 也就是要调用 close() 函数。open()函数, 其常用形式为, 接收两…

北京Java周末班,钱烧了却没学到东西?别让暑假变成‘废铁’锻造厂

北京Java周末班,钱烧了却没学到东西?别让暑假变成‘废铁’锻造厂

2026/7/12 2:53:48

针对Java学习者而言, 参与一门出色的Java培训班, 能够迅速提升技能以及水平。暑假阶段是诸多学生学习Java的良好时机, 那么北京暑假Java培训班收费若何呢?本文会从几个层面来剖析影响北京暑假Java培训班收费的因素, 并给出一些小编的建议。1. 授课同学的水平和经验影响收费的一…

CTF Web 源码审计 5 步法:从备份文件泄露到 Flag 构造实战

CTF Web 源码审计 5 步法:从备份文件泄露到 Flag 构造实战

2026/7/12 2:53:48

CTF Web 源码审计 5 步法&#xff1a;从备份文件泄露到 Flag 构造实战在CTF竞赛中&#xff0c;Web类题目往往是最容易上手但也最考验综合能力的赛道。不同于二进制逆向或密码学需要深厚的理论基础&#xff0c;Web安全更注重实战中的漏洞嗅觉和快速验证能力。本文将系统化拆解一…

Java扛不住?Oracle临时表这招绝了,事务级瞬清数据

Java扛不住?Oracle临时表这招绝了,事务级瞬清数据

2026/7/12 2:53:48

在或以上版本中&#xff0c;可以创建以下两种临时表&#xff1a; 1。会话特有的临时表 ( )ON ROWS&#xff1b; 2。事务特有的临时表 ( )ON ROWS&#xff1b;TABLE 临时表是所建, 但它虽确实存在着, 然而你去尝试选一条记录, 之后用别的连接登录上去, 会发现记录却是空的,…

AC Recovery 功能深度解析:Power On/Off/Last State 3种模式的适用场景与风险

AC Recovery 功能深度解析:Power On/Off/Last State 3种模式的适用场景与风险

2026/7/12 2:53:48

AC Recovery功能深度解析&#xff1a;Power On/Off/Last State三种模式的适用场景与风险当数据中心遭遇突发断电&#xff0c;或是智能家居设备因电力波动离线&#xff0c;系统能否在供电恢复时自动唤醒&#xff0c;往往决定着业务连续性。AC Recovery&#xff08;交流电源恢复&…

企业级AI应用必须启用的深度思考开关——DeepSeek v3.2.1新增mode=“think_deep”参数深度解读(仅限首批认证伙伴开放)

企业级AI应用必须启用的深度思考开关——DeepSeek v3.2.1新增mode=“think_deep”参数深度解读(仅限首批认证伙伴开放)

2026/7/12 2:43:48

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;企业级AI应用必须启用的深度思考开关——DeepSeek v3.2.1新增mode“think_deep”参数深度解读&#xff08;仅限首批认证伙伴开放&#xff09; 核心能力定位 mode"think_deep" 并非简单提升…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析&#xff1a;XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南&#xff1a;为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战&#xff1a;基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载&#xff1a;…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析&#xff1a;XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南&#xff1a;为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战&#xff1a;基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载&#xff1a;…