1. 概述
在这篇简短的教程中,我们将重点介绍如何使用 Mockito 来模拟(mock)final 类和 final 方法。
与我们之前介绍 Mockito 框架的其他文章类似(例如 Mockito Verify、Mockito When/Then 和 Mockito 的 Mock 方法),我们依然会使用下面这个 MyList
类作为测试中的协作对象(collaborator):
public class MyList extends AbstractList<String> {
final public int finalMethod() {
return 0;
}
}
此外,我们还会创建一个 final
的子类:
public final class FinalList extends MyList {
@Override
public int size() {
return 1;
}
}
2. 模拟 Final 方法
✅ 只要 Mockito 配置正确,模拟 final 方法和普通方法一样简单:
@Test
public void whenMockFinalMethod_thenMockWorks() {
MyList myList = new MyList();
MyList mock = mock(MyList.class);
when(mock.finalMethod()).thenReturn(1);
assertThat(mock.finalMethod()).isNotZero();
}
在这个例子中,我们创建了 MyList
的真实实例和 mock 实例,分别调用 finalMethod()
,验证 mock 行为是否生效。
3. 模拟 Final 类
✅ 模拟 final 类和模拟普通类一样简单:
@Test
public void whenMockFinalClass_thenMockWorks() {
FinalList mock = mock(FinalList.class);
when(mock.size()).thenReturn(2);
assertThat(mock.size()).isNotEqualTo(1);
}
和上面类似,我们创建了 FinalList
的真实实例和 mock 实例,模拟了 size()
方法并验证 mock 是否按预期工作。
⚠️ 注意:默认情况下,Mockito 是不能直接 mock final 类和方法的。要实现这一点,需要启用 Mockito 的 inline mock maker 扩展。
启用方式
在 src/test/resources/mockito-extensions/
目录下创建一个名为 org.mockito.plugins.MockMaker
的文件,内容如下:
mock-maker-inline
这个配置会告诉 Mockito 使用其 inline mock maker,从而支持对 final 类和方法的模拟。
4. 小结
在这篇文章中,我们介绍了如何通过 Mockito 的扩展机制来模拟 final 类和方法。
虽然默认情况下 Mockito 不支持这一功能,但通过简单的配置即可轻松实现。
完整示例代码可以在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito-simple ✅