You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mockito mock Java record类报final类无法mock如何解决?

Mockito 模拟 Java Record 类的解决方案

报错原因

Java 中的 record 类默认是 final 修饰的,旧版本 Mockito 默认配置下不支持模拟 final 类,因此抛出你遇到的异常。

解决方案

方案1:升级到 Mockito 5.x 及以上版本

Mockito 5.0 之后默认启用了 inline mock maker,原生支持模拟 final 类、record 类,无需额外配置,直接使用即可:

@Test
public void testRecord() {
    record Rec(){}
    Rec mockRec = Mockito.mock(Rec.class);
    // 后续测试逻辑
}

方案2:低版本 Mockito 启用 inline mock maker

如果你使用的是 Mockito 3.2 ~ 4.x 版本,可以通过以下任意一种方式开启 final 类模拟支持:

  • 方式一:引入mockito-inline依赖(Maven 示例)
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>你的Mockito版本号</version>
    <scope>test</scope>
</dependency>
  • 方式二:添加配置文件
    在src/test/resources/mockito-extensions目录下新建名为org.mockito.plugins.MockMaker的文件,文件内容写入:
mock-maker-inline

方案3(优先推荐):直接构造 Record 实例

Record 本质是不可变的数据载体,设计初衷就是用来简化数据类的实现,如果没有特殊的模拟需求,直接构造真实的 Record 实例使用比模拟更稳妥,性能更好,也不会出现非预期的行为:

@Test
public void testRecord() {
    record Rec(String name, int age){}
    Rec realRec = new Rec("test", 18);
    // 直接使用真实实例测试
}

注意事项

即使通过配置支持了 Record 类的模拟,也不建议随意修改 Record 访问器的默认行为,避免测试逻辑和实际生产逻辑出现偏差。

内容的提问来源于stack exchange,提问作者apflieger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:06:07