You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.jar
  • mockito-inline-4.11.0.jar
  • byte-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:57:16