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()。

相关新闻

最新新闻

批量设备通信选型:CAN总线可靠性的原理与SocketCAN实践

批量设备通信选型:CAN总线可靠性的原理与SocketCAN实践

做批量设备开发的工程师,选通信方案时大概率都纠结过:RS-485 便宜但主从轮询效率低,以太网带宽高但布线成本和协议复杂度跟着涨,无线省线束却怕现场干扰。真正到了量产阶段,还要考虑每台设备的装配时间、售后服务能不能…

2026/8/29 7:56:27
32位单片机进阶指南:补足底层原理与调试能力,告别例程依赖

32位单片机进阶指南:补足底层原理与调试能力,告别例程依赖

很多人学32单片机学到一半,会觉得后劲不足:例程能跑,点灯会点,串口能打印,但一让做完整的小项目就卡住。这个问题不是32位单片机不行,也不是你的板子太便宜,而是学习方式停留在“抄例程改引脚”…

2026/8/29 7:56:27
车载测试自学路线:从CANoe到Python,不花2万也能入行

车载测试自学路线:从CANoe到Python,不花2万也能入行

最近在后台收到很多转行朋友的私信,问得最多的不是“车载测试有没有前途”,而是“某培训机构的 2 万块课程到底值不值得报”。网上也一直能看到类似的帖子:被坑 2 万报了车载测试班,结果发现课程内容零散、工具链老旧,…

2026/8/29 7:56:27
从传热学到数值求解:回焊炉炉温曲线建模的工程实践

从传热学到数值求解:回焊炉炉温曲线建模的工程实践

1. 问题引入:从“炉温曲线”到“回焊炉”的工程建模挑战 2020年高教社杯全国大学生数学建模竞赛的A题,题目是“炉温曲线”。这个题目一出来,很多同学,尤其是第一次接触国赛的同学,可能会觉得有点懵。它不像一些题目那样…

2026/8/29 7:56:27
OLM转PST完整指南:邮件迁移的格式差异、操作步骤与常见问题排查

OLM转PST完整指南:邮件迁移的格式差异、操作步骤与常见问题排查

OLM to PST Converter 这类工具解决的其实是一个很具体的迁移问题:把 Mac 版 Outlook 中的邮件、联系人、日历和任务从 .olm 文件转成 Windows 版 Outlook 能直接打开的 .pst 文件。如果你正在从 Mac 换到 Windows,或者公司要把旧的 Mac 办公环境迁到…

2026/8/29 7:56:27
独显与核显跑本地大模型:显存带宽、量化与推理框架实测对比

独显与核显跑本地大模型:显存带宽、量化与推理框架实测对比

之前有朋友问我:本地跑大模型,究竟是“有独显就行”还是“随便一台轻薄本也能凑合”?这个问题看起来简单,但背后的差距远不止“快一点”和“慢一点”这么简单。它涉及显存容量、显存带宽、量化策略、推理框架调度等多个环节。这篇…

2026/8/29 7:51:27