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

