求助:Mockito无法mock StrLookup类(Java 11环境)
解决Mockito无法Mock org.apache.commons.lang.text.StrLookup的问题
问题核心信息
- 触发异常:
org.mockito.exceptions.base.MockitoException,提示无法mockorg.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
相关产品推荐
相关产品推荐

