spring boot集成mockito单元测试的核心是不启动完整spring上下文、只测业务逻辑、用mock隔离依赖;依赖由spring-boot-starter-test内置提供,测试需用@extendwith(mockitoextension.class)启用支持,@mock声明模拟对象,@injectmocks自动注入,配合when/verify实现打桩与验证,@spy用于部分真实调用场景。

1. 依赖已经内置,不用额外加
只要你的项目用了 spring-boot-starter-test(新建 Spring Boot 项目默认就有),Mockito、JUnit 5、AssertJ 等就全齐了:
✅ 不需要单独引入 mockito-core —— 否则可能版本冲突;
✅ @Mock、@InjectMocks、@ExtendWith(MockitoExtension.class) 都能直接用。
2. 写测试类的三步关键操作
以测试 UserService 为例,它依赖 UserRepository 和 EmailService:
-
启用 Mockito 支持:加上
@ExtendWith(MockitoExtension.class)(JUnit 5 必须) -
声明 Mock 对象:用
@Mock标注UserRepository和EmailService -
构造被测对象:用
@InjectMocks标注UserService,Mockito 自动把上面两个 Mock 注入进去
3. 模拟行为 + 验证调用
测试中常用两件事:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
打桩(Stubbing):用
when(...).thenReturn(...)或thenThrow(...)定义依赖返回什么
→ 例如:when(userRepository.findById(1L)).thenReturn(Optional.of(new User("Alice"))) -
验证(Verification):用
verify(...).method(...)确认是否按预期调用了依赖
→ 例如:verify(emailService, times(1)).sendWelcomeEmail("Alice")
4. 注意 mock 和 spy 的区别
多数场景用 @Mock 就够了,但遇到要“部分调用真实方法”的情况(比如只 mock 某个耗时子方法),就得换 @Spy:
-
@Mock UserRepository repo→ 所有方法都拦截,不执行原逻辑,返回 null/0/false -
@Spy UserRepository spyRepo→ 除显式 stub 的方法外,其余调用真实实现
注意:@Spy 对象也要配合 @InjectMocks 使用,否则注入的是原始 bean 而非 spy 实例。










