mockito 4.6.0 及以上版本通过 byte buddy 代理机制原生支持 mock final 类,无需额外配置即可直接调用 mock()。对于旧版本或需要兼容的场景,可以使用 mockito inline 扩展包来启用对 final 类的模拟能力。核心做法是确保依赖版本匹配并正确引入扩展。

如何在新版 Mockito 中直接 Mock Final 类
在 Mockito 4.6.0+ 版本中,你可以直接使用 mock(FinalClass.class) 来创建 final 类的 mock 对象,因为底层字节码生成库已升级。
例如:
import static org.mockito.Mockito.*;
final class FinalService {
public String getValue() { return "real"; }
}
// 直接 mock
FinalService mock = mock(FinalService.class);
when(mock.getValue()).thenReturn("mocked");
System.out.println(mock.getValue()); // 输出: mocked

如何在旧版 Mockito 中通过 Inline 扩展 Mock Final 类
如果使用 Mockito 3.x 或更早版本,默认无法 mock final 类,需引入 mockito-inline 依赖。
Maven 依赖示例:
<dependency><groupid>org.mockito</groupid><artifactid>mockito-inline</artifactid><version>3.12.4</version><scope>test</scope></dependency>
代码用法与新版一致,直接调用 mock() 即可生效,无需其他特殊设置。

Mock Final 类时静态方法如何处理
即使成功 mock 了 final 实例类,其静态方法仍需用 mockStatic() 单独处理,且需注意作用域关闭。
示例:
try (MockedStatic<finalutil> util = mockStatic(FinalUtil.class)) {
util.when(FinalUtil::compute).thenReturn(42);
assertEquals(42, FinalUtil.compute());
}</finalutil>
未正确关闭会导致内存泄漏或测试干扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











