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

使用mockito-inline时mock RandomAccessFile抛出Stream closed异常如何解决

问题根因

RandomAccessFile的length()是native方法,你使用的2.8.47版本mockito-inline对JDK内置类的native方法mock存在兼容性缺陷,mock逻辑未生效,实际调用了原生方法,而mock生成的对象没有对应的打开文件句柄,因此抛出Stream Closed异常。

可行解决方案
  • 方案1:升级Mockito版本到3.4及以上
    该版本优化了JDK内置类native方法的mock支持,无需修改现有测试逻辑,仅需调整依赖版本即可,同时不会影响现有final类mock的能力,推荐优先使用该方案。
    依赖配置参考:
    testImplementation "org.mockito:mockito-inline:4.11.0"
    
  • 方案2:使用doReturn语法替代when语法
    若暂时无法升级依赖,可修改mock写法,doReturn语法不会触发原方法的调用,对native方法的mock兼容性更强,修改后的代码如下:
    RandomAccessFile mockRAF = mock(RandomAccessFile.class);
    doReturn(len).when(mockRAF).length();
    
  • 方案3:抽象接口隔离依赖
    在业务代码中定义文件操作接口封装RandomAccessFile的能力,业务逻辑依赖抽象接口而非具体实现类,测试时直接mock自定义接口即可,该方案从根本上避免了JDK内置类native方法的mock问题,同时提升了代码的可测试性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:05