我们正在从Java 8升级到11。在完成所有必要的SDK更改之后,我开始使用maven运行单元测试。所有使用Mockito
的测试均失败,并带有
java.lang.ClassCastException:
class org.mockito.codegenEventapiManager$MockitoMock$1091821173 cannot be cast to class
org.mockito.internal.creation.bytebuddy.MockAccess
(org.mockito.codegenEventapiManager$MockitoMock$1091821173 is in unnamed module of loader
org.powermock.core.classloader.javassist.JavassistMockClassLoader @1473b8c0;
org.mockito.internal.creation.bytebuddy.MockAccess is in unnamed module of loader 'app')
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:48)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
at org.powermock.api.mockito.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:41)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)
at org.mockito.Mockito.mock(Mockito.java:1896)
at org.mockito.Mockito.mock(Mockito.java:1805)
[...line where we cal Mockito, rest is ommitted]
这可能与某些依赖项中的版本号不匹配吗?
我们正在使用
mockito-core 2.24.0, excluding byte-buddy, byte-buddy-agent and objenesis
powermock-module-testng 2.0.4 (excluding above)
powermock-api-mockito2 2.0.4
objenesis 3.1
byte-buddy 1.9.7
byte-buddy-agent 1.9.7
模拟类很简单:
EventapiManager mockManager = Mockito.mock(EventapiManager.class);
模拟的类本身是公共的,并且在Java 8上一切正常。
我以一种意想不到的方式解决了我的问题:在寻找解决方案时,我遇到了this注释,该注释描述了我的另一项失败测试。在该测试装置中,我们确实使用了注释中描述的PowerMock
批注,但其中没有建议使用任何被忽略的软件包。所以我添加了它们,制作了被忽略软件包的完整列表:
@PowerMockIgnore({"javax.management.*", "javax.script.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*"})
这神秘地解决了所有故障,包括上面提到的所有故障都放在不同的包装中。