mockito 是 java 单元测试中用于隔离外部依赖的主流模拟框架,支持通过 mock()、@mock、@injectmocks 创建和注入模拟对象,并用 when/verify 控制行为与验证调用。

在 Java 单元测试中,Mockito 是最常用的模拟框架之一,它能帮你隔离被测类的外部依赖(比如 Service、DAO、第三方 API 客户端等),让测试专注逻辑本身,不依赖真实环境。
1. 添加 Mockito 依赖
使用 Maven 的项目,在 pom.xml 中引入:
JUnit 5 + Mockito 4+(推荐):
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
<dependency><groupid>org.mockito</groupid><artifactid>mockito-core</artifactid><version>5.12.0</version><scope>test</scope></dependency><dependency><groupid>org.junit.jupiter</groupid><artifactid>junit-jupiter</artifactid><version>5.10.2</version><scope>test</scope></dependency>
2. 基本 Mock 创建与行为定义
假设有一个 UserService 依赖 UserRepository,你想测试 UserService 的逻辑,但不想调用真实数据库:
- 用 Mockito.mock() 创建 UserRepository 的模拟对象
- 用 when(...).thenReturn(...) 定义方法调用时的返回值
- 将 mock 对象注入被测对象(可通过构造函数、setter 或字段注入)
示例代码:
public class UserServiceTest {
private UserRepository userRepository = Mockito.mock(UserRepository.class);
private UserService userService = new UserService(userRepository);
@Test
void shouldReturnUserWhenIdExists() {
// 给 mock 的 findUserById 返回一个预设用户
User mockUser = new User(1L, "Alice");
Mockito.when(userRepository.findUserById(1L)).thenReturn(mockUser);
User result = userService.getUserById(1L);
assertThat(result).isEqualTo(mockUser);
Mockito.verify(userRepository).findUserById(1L); // 验证方法确实被调用
}
}
3. 常用技巧与注意事项
- @Mock 注解:配合 @ExtendWith(MockitoExtension.class)(JUnit 5)可自动创建 mock 实例,更简洁
- @InjectMocks:自动把标注了 @Mock 的对象注入到被测类中(按类型匹配)
- 对 void 方法使用 doNothing() / doThrow() / doAnswer(),不能用 when(...).thenReturn()
- 用 verify() 检查依赖方法是否被调用、调用次数或参数是否符合预期
- 避免 mock 过多层级(如 mock 一个 service 再 mock 它内部的 dao),优先考虑“协作测试”而非“过度隔离”
4. 真实场景小提醒
如果依赖对象是 final 类、静态方法或私有方法——Mockito 默认不支持(尤其旧版本)。此时可考虑:
- 升级到 Mockito 4+ 并启用 mockito-inline(需额外依赖)来 mock final 类/方法
- 静态方法尽量封装到可替换的接口中,再 mock 接口
- 慎用 PowerMock(已基本废弃),优先重构代码提升可测性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










