使用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
相关产品推荐
相关产品推荐

