研发协作
用 Mockito 对 Service…
当需要在不启动 Spring 容器、不连数据库、不调外部 API 的情况下测试 @Service 类的业务逻辑时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Mockito 对 Service 通用
解决思路
- 用 @ExtendWith(MockitoExtension.class) 启用 Mockito 注解,搭建测试类。
- 用 @Mock 声明依赖(repository、client),用 @InjectMocks 声明被测 service。
- 按 Arrange-Act-Assert 组织测试:Arrange 阶段创建测试数据并用 when().thenReturn() 配置 mock 返回值;Act 阶段调用被测 service 方法;Assert 阶段用 AssertJ 断言返回值、用 verify() 校验 mock 交互,并运行测试确认通过。
- 用 when().thenThrow() 让 mock 抛异常来测试异常场景,并校验异常类型与消息。
- 运行完整测试套件(mvn test 或 gradle test),用 mvn test jacoco:report 查看覆盖率报告,确认所有 service 方法都有对应测试。
- 用 verify() 校验方法调用,例如确认 userRepository.save(any(User.class)) 和 emailService.sendWelcomeEmail(...) 被调用。
- 对多依赖、参数捕获器(ArgumentCaptor)、异步 service、InOrder 校验等更多模式,参考 references/examples.md。
- 遵循最佳实践:只 mock 被测 service 的直接依赖;每个测试方法只测一个行为;使用 expectedUser、actualUser、captor 等描述性变量名;对值对象和 DTO 创建真实实例而非 mock。
- 避免 mock 值对象或 DTO,用测试数据创建真实实例。
- 避免 mock 过多依赖,若 service 协作者过多应考虑重构。
- 保证测试相互独立,不依赖执行顺序。
- 谨慎使用 @Spy,部分 mock 更难理解和维护。
- 不要直接测试私有方法,应通过公共方法行为间接测试。
- 同一 stub 中参数匹配器(any()、eq())不能与真实值混用。
- 避免过度校验,只校验对测试场景重要的交互。
适用边界 · 注意事项
- 需要验证真实数据库交互或 Spring 容器集成行为时(应改用集成测试)。
- 被测 service 依赖过多、逻辑复杂到 mock 难以维护时,应先重构再测试。