首页
学习
活动
专区
圈层
工具
发布

使用Mockito时mock()和stub()有什么区别?

在单元测试中,Mockito 的 mock()stub() 是两种不同的行为模拟方式,核心区别在于用途实现逻辑。以下是详细对比:

1. 基础概念

  • mock() 创建一个虚拟对象,模拟真实对象的行为。默认情况下,所有方法返回 null 或原始类型的默认值(如 0false),不执行真实逻辑。
  • mock() 创建一个虚拟对象,模拟真实对象的行为。默认情况下,所有方法返回 null 或原始类型的默认值(如 0false),不执行真实逻辑。
  • stub() 是 Mockito 早期版本(1.x)的术语,现已被 when().thenReturn() 替代。用于为模拟对象的方法指定返回值定义行为
  • stub() 是 Mockito 早期版本(1.x)的术语,现已被 when().thenReturn() 替代。用于为模拟对象的方法指定返回值定义行为

2. 关键区别

| 特性 | mock() | stub()(现代写法:when().thenReturn()) | |----------------|-----------------------------------|---------------------------------------------| | 作用 | 创建模拟对象 | 为模拟对象的方法定义具体行为 | | 默认行为 | 方法返回 null 或默认值 | 需显式指定返回值或异常 | | 调用验证 | 可结合 verify() 检查方法调用 | 仅定义行为,不直接参与验证 | | 版本演进 | 始终是核心 API | 旧版术语,现用 when().thenReturn() |

3. 应用场景

  • mock() 适用场景
    • 需要隔离依赖对象(如数据库、外部服务)。
    • 测试对象间的交互(如是否调用了某方法)。
  • stub()when())适用场景
    • 需要模拟方法的返回值(如 userService.getUser() 返回特定用户)。
    • 模拟异常行为(如 thenThrow())。

4. 代码示例

代码语言:txt
复制
// 1. 创建 Mock 对象
List<String> mockedList = Mockito.mock(List.class);

// 2. Stub 方法行为(现代写法)
when(mockedList.get(0)).thenReturn("first");
when(mockedList.size()).thenThrow(new RuntimeException());

// 3. 验证交互
mockedList.add("test");
verify(mockedList).add("test"); // 验证 add() 被调用

5. 常见问题与解决

  • 问题:为什么 mock() 后方法返回 null 原因:Mock 对象默认不执行真实逻辑。 解决:通过 when().thenReturn() 显式定义返回值。
  • 问题:stub() 过时了吗? 原因:Mockito 2.x 后推荐使用 when() 语法,更清晰。 解决:直接使用 when().thenReturn() 替代旧版 stub()

总结

  • mock()创建模拟对象的工具。
  • stub()(现代写法)是定义对象行为的工具。
  • 两者通常结合使用:先 mock() 创建对象,再 when() 定义其方法行为。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券