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
解决方案
补全缺失的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>替换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依赖。检查依赖传递问题
执行mvn dependency:tree(Maven)或./gradlew dependencies(Gradle)查看依赖树,确认是否存在Elasticsearch版本冲突,排除冲突版本,确保与spring-data-elasticsearch的依赖版本一致。
内容的提问来源于stack exchange,提问作者Harish Kumar Saini
相关产品推荐
相关产品推荐

