在单元测试中,Mockito 的 mock()
和 stub()
是两种不同的行为模拟方式,核心区别在于用途和实现逻辑。以下是详细对比:
mock()
创建一个虚拟对象,模拟真实对象的行为。默认情况下,所有方法返回 null
或原始类型的默认值(如 0
、false
),不执行真实逻辑。mock()
创建一个虚拟对象,模拟真实对象的行为。默认情况下,所有方法返回 null
或原始类型的默认值(如 0
、false
),不执行真实逻辑。stub()
是 Mockito 早期版本(1.x)的术语,现已被 when().thenReturn()
替代。用于为模拟对象的方法指定返回值或定义行为。stub()
是 Mockito 早期版本(1.x)的术语,现已被 when().thenReturn()
替代。用于为模拟对象的方法指定返回值或定义行为。| 特性 | mock()
| stub()
(现代写法:when().thenReturn()
) |
|----------------|-----------------------------------|---------------------------------------------|
| 作用 | 创建模拟对象 | 为模拟对象的方法定义具体行为 |
| 默认行为 | 方法返回 null
或默认值 | 需显式指定返回值或异常 |
| 调用验证 | 可结合 verify()
检查方法调用 | 仅定义行为,不直接参与验证 |
| 版本演进 | 始终是核心 API | 旧版术语,现用 when().thenReturn()
|
mock()
适用场景stub()
(when()
)适用场景userService.getUser()
返回特定用户)。thenThrow()
)。// 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() 被调用
mock()
后方法返回 null
?
原因:Mock 对象默认不执行真实逻辑。
解决:通过 when().thenReturn()
显式定义返回值。stub()
过时了吗?
原因:Mockito 2.x 后推荐使用 when()
语法,更清晰。
解决:直接使用 when().thenReturn()
替代旧版 stub()
。mock()
是创建模拟对象的工具。stub()
(现代写法)是定义对象行为的工具。mock()
创建对象,再 when()
定义其方法行为。没有搜到相关的文章