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

求助:Mockito无法mock StrLookup类(Java 11环境)

解决Mockito无法Mock org.apache.commons.lang.text.StrLookup的问题

问题核心信息

  • 触发异常:org.mockito.exceptions.base.MockitoException,提示无法mock org.apache.commons.lang.text.StrLookup
  • 底层异常链:java.lang.IllegalArgumentException: Could not create type → java.lang.VerifyError
  • 报错位置:com.vorwerk.aem.global.email.AbstractEmailActionTest.java:38
  • 运行环境:Java 11(Oracle HotSpot 11.0.22+9-LTS-219)、Linux 5.10.102.2-microsoft-standard,Mockito配置为inline mocks

可行解决方案

1. 替换Commons Lang版本

org.apache.commons.lang.text.StrLookup属于Commons Lang 2.x分支,该版本类的字节码与Java 11的inline mock模式兼容性较差,容易触发字节码验证错误。

  • 若代码允许,直接替换为Commons Lang 3.x的org.apache.commons.lang3.text.StrLookup,3.x版本对Java 8+做了适配,Mockito能更稳定地处理其mock。

2. 切换Mockito的Mock创建策略

既然异常提示与inline mocks的限制相关,可尝试切换回CGLIB代理模式:

  • 局部生效:在测试类的Mock声明上添加配置:
    @Mock(mockMaker = MockMakerType.CGLIB)
    private StrLookup strLookup;
    
  • 全局生效:在项目的src/test/resources/mockito-extensions/目录下创建org.mockito.plugins.MockMaker文件,写入内容:
    mock-maker-cglib
    

3. 排查依赖冲突

即使更换过Mockito版本,仍可能存在依赖冲突导致的问题:

  • 用Maven或Gradle命令查看依赖树:
    # Maven
    mvn dependency:tree
    # Gradle
    ./gradlew dependencies
    
  • 检查是否存在多个版本的commons-lang或Mockito相关依赖,排除旧版本的冲突依赖。
  • 确保mockito-inline与mockito-core版本完全一致,避免版本不匹配。

4. 替代Mock方案

如果上述方法都无效,可绕过Mock直接构造实例:

  • 手动实现StrLookup的匿名内部类实例,用于测试:
    private StrLookup strLookup = new StrLookup() {
        @Override
        public String lookup(String key) {
            // 返回测试所需的固定值
            return "test-value";
        }
    };
    
  • 若原类可实例化,使用Spy替代Mock:
    StrLookup strLookup = Mockito.spy(new StrLookup() {});
    

内容的提问来源于stack exchange,提问作者Ronald Manrique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:19