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

Mockito无法Mock ElasticsearchOperations接口的问题求助

问题

在Spring Boot应用中测试注入了ElasticsearchOperations Bean的服务类时,Mockito无法Mock该接口,抛出MockitoException。底层报错原因为找不到org.elasticsearch.cluster.metadata.AliasMetaData类。已尝试参考相关问题方案、更新mockito-inline版本等方法,但问题仍未解决。


报错详情

org.mockito.exceptions.base.MockitoException: 
Mockito无法Mock该类:interface org.springframework.data.elasticsearch.core.ElasticsearchOperations。

若不确定报错原因,请发送邮件至Mockito邮件列表。

Java               : 11
JVM厂商名称    : Oracle Corporation
JVM厂商版本 : 11.0.2+9
JVM名称           : OpenJDK 64-Bit Server VM
JVM版本        : 11.0.2+9
JVM信息           : mixed mode
操作系统名称            : Mac OS X
操作系统版本         : 10.15.7

显示此提示是因为Mockito配置为创建内联Mock。
可查看Mockito类文档的第39项了解内联Mock及其限制。

底层异常 : org.mockito.exceptions.base.MockitoException: 无法修改所有类 [interface org.springframework.data.elasticsearch.core.SearchOperations, interface org.springframework.data.elasticsearch.core.ElasticsearchOperations, interface org.springframework.data.elasticsearch.core.DocumentOperations]
    at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:153)
    ...[省略部分栈信息]
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.cluster.metadata.AliasMetaData
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    ... 121 more

测试类代码

@ExtendWith(MockitoExtension.class)
class MyServiceTest {

    @InjectMocks
    MyServiceImpl serviceImpl;

    @Mock
    ElasticsearchOperations elasticsearchOperations;

    @Mock
    IndexNameUtil indexNameUtil;

    @Test
    void test_saveEntities() {
        when(indexNameUtil.getIndex()).thenReturn("test");
        doNothing().when(elasticsearchOperations.save(any(), any()));
        serviceImpl.save(getEntityListMock());
        verify(elasticsearchOperations, times(1)).save(any(), any());
    }
  
  List<Obj> getEntityListMock() {
  // 返回模拟对象列表
  }
}

使用的依赖

  • mockito-inline::3.11.2
  • Java版本:openjdk version "11.0.2" 2019-01-15
  • spring-data-elasticsearch::4.0.0.RELEASE

解决方案

  1. 补全缺失的Elasticsearch核心依赖
    报错的根本原因是测试环境中缺少org.elasticsearch.cluster.metadata.AliasMetaData所在的Elasticsearch核心包。由于spring-data-elasticsearch:4.0.0.RELEASE依赖的Elasticsearch版本是7.9.3,需在测试依赖中添加对应版本的elasticsearch-core:

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch-core</artifactId>
        <version>7.9.3</version>
        <scope>test</scope>
    </dependency>
    
  2. 替换Mockito实现方式(备选)
    如果不想引入额外依赖,可尝试将mockito-inline替换为传统的mockito-core,修改依赖为:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.11.2</version>
        <scope>test</scope>
    </dependency>
    

    并移除mockito-inline依赖。

  3. 检查依赖传递问题
    执行mvn dependency:tree(Maven)或./gradlew dependencies(Gradle)查看依赖树,确认是否存在Elasticsearch版本冲突,排除冲突版本,确保与spring-data-elasticsearch的依赖版本一致。


内容的提问来源于stack exchange,提问作者Harish Kumar Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:33:17