Mockito-inline 在 RandomAccessFile 上抛出 Stream 关​​闭异常

Mockito-inline throws Stream closed exception on RandomAccesFile

我的测试代码中有以下几行

RandomAccessFile mockRAF = mock(RandomAccessFile.class);
when(mockRAF.length()).thenReturn(len);

有这样的依赖性

testImplementation "org.mockito:mockito-inline:2.8.47"

并获得

Stream Closed
java.io.IOException: Stream Closed
    at java.base/java.io.RandomAccessFile.length(Native Method)
    at com.example.examplepackage.enterprise.app.Installation$RealFileAccessor.readInstallationFile(Installation.java:87)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/java.lang.Thread.run(Thread.java:834)

这个错误。 我尝试了几件事但没有成功。删除 mockito-inline 不是一个选项,因为有很多测试模拟 final 类。 是否有任何可能的解决方案我可以尝试使它起作用?

模拟失败的原因是RandomAccessFile.length()是一个本地方法。

mockito-inline 无法模拟本机方法。见 Mocking final types, enums and final methods:

Some methods cannot be mocked

  • Package-visible methods of java.*
  • native methods

解决方法:

  • 如果可能,使用 RAF 在测试方法中实现的接口之一
  • 用你自己的 class 委托给 RAF
  • 包装 RAF
  • 在测试中使用真实的 RAF,但将其指向您在测试中创建的临时文件