Guidewire中Mockito静态方法Mocking:类加载异常求助
在Guidewire PC 9.0.5中编写GUnit测试用例,尝试使用Mockito 4.11 Mock某类的静态方法,所有依赖Jar已放置在GW的plugins/lib目录下,但运行测试时抛出ClassNotFoundException,找不到org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker类。同一套Mockito Jar包及依赖在普通JDK 8 Java项目中可正常运行,使用的是Mockito inline mock maker。
测试代码
function testSearchById(){ //GIVEN using(var mockedFactory = Mockito.mockStatic(ExternalServiceClient.Type)){ var party = new Party() party.TaxId = "12345" party.PartyId = "partyid:12345" mockedFactory.when(()-> ExternalServiceClient.searchById(Mockito.any())).thenReturn(party) //WHEN var retParty = ExternalServiceClient.searchById("100") //THEN assertEquals(retParty.PartyId, "partyid:12345") } }
报错信息
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:84) at com.sun.proxy.$Proxy65.createStaticMock(Unknown Source) at org.mockito.internal.util.MockUtil.createStaticMock(MockUtil.java:202) at org.mockito.internal.MockitoCore.mockStatic(MockitoCore.java:134) Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@347f4f39 at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:56) at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:65) Caused by: java.lang.ClassNotFoundException: org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
问题原因及解决方案
1. 依赖包不完整或版本不匹配
Mockito 4.11的inline mock功能需要以下核心依赖包,确保所有包都已放入plugins/lib且版本与Mockito 4.11严格兼容:
mockito-core-4.11.0.jarmockito-inline-4.11.0.jarbyte-buddy-1.12.22.jar(Mockito 4.11对应的官方适配版本)byte-buddy-agent-1.12.22.jar
2. 调整依赖放置目录
Guidewire使用自定义类加载器,plugins/lib目录下的类可能未被测试代码的类加载器正确识别。尝试将Mockito相关依赖移动到gw/test/lib目录,该目录是Guidewire专门用于测试依赖的路径,类加载优先级更高。
3. 显式指定MockMaker实现
在测试资源目录下创建mockito-extensions/org.mockito.plugins.MockMaker文件,文件内容仅一行:
mock-maker-inline
强制Mockito加载inline mock maker实现,避免类加载时的自动发现逻辑失效。
4. 降级Mockito版本
Mockito 4.x引入的部分新特性可能与Guidewire 9.0.5的类加载器不兼容,尝试降级到Mockito 3.x系列(如3.12.4),该版本的inline mock实现更稳定,兼容性更好。
5. 验证类加载路径
在测试代码中添加打印逻辑,确认类加载器是否能识别plugins/lib下的Mockito Jar包:
println this.getClass().getClassLoader().getURLs()
查看输出是否包含目标Jar的路径,若未包含,需检查Guidewire配置文件(如gw-config.properties),确保plugins/lib被添加到类加载路径中。
内容的提问来源于stack exchange,提问作者AJITH KUNDUKULANGARA JOSE

