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,但将其指向您在测试中创建的临时文件
我的测试代码中有以下几行
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,但将其指向您在测试中创建的临时文件