使用Mockito 3.8无法Mock AEM核心组件Teaser接口问题求助
报错原因
报错核心原因并非Teaser接口不符合Mock要求(公共接口本身满足Mockito mock的基础条件),问题来自报错末尾的底层异常:java.lang.IllegalStateException: Type not found: com.adobe.cq.wcm.core.components.internal.jackson.ComponentDataModelSerializer
- Teaser接口上标注了Jackson序列化相关注解,关联了上述内部包下的序列化实现类
- 你的项目中AEM WCM Core Components依赖通常会设置为
provided范围(AEM服务器运行时自带该依赖,无需打包部署),导致测试类路径下没有加载该内部序列化类 - Mockito 3.8版本mock带第三方注解的接口时,会强制解析注解关联的所有类元数据,类加载失败后就会抛出外层的无法mock异常
解决方案
可按优先级选择以下任意一种方案处理:
- 优先升级Mockito版本:将Mockito Core升级到3.9及以上版本(推荐4.0+稳定版),该版本开始优化了注解解析逻辑,不会强制加载注解关联的非必要类,无需改动其他配置即可解决问题
- 补充测试依赖:在项目的测试依赖中引入对应版本的AEM WCM Core Components依赖,范围设置为
test,确保测试类路径下可以加载到内部序列化类 - 跳过注解解析:如果无法升级Mockito版本,mock的时候指定跳过注解解析即可,示例代码如下:
import org.mockito.Mockito; import com.adobe.cq.wcm.core.components.models.Teaser; // mock逻辑 Teaser mockTeaser = Mockito.mock(Teaser.class, Mockito.withSettings().withoutAnnotations());
内容的提问来源于stack exchange,提问作者Phoenix_uy
相关产品推荐
相关产品推荐

