Spring Java中OpenSearchClient API测试Mock方法歧义问题求解
解决OpenSearchClient的msearch方法Mock编译歧义问题
问题场景
在Spring Java环境下编写JUnit测试,Mock org.opensearch.client.opensearch.OpenSearchClient的msearch、bulk等API时出现编译错误。
待Mock的msearch方法签名:
public <TDocument> MsearchResponse<TDocument> msearch(MsearchRequest request, Class<TDocument> tDocumentClass) throws IOException, OpenSearchException
使用的Mock代码:
Mockito.when(client.msearch(ArgumentMatchers.any(), ArgumentMatchers.any())) .thenReturn(mSearchResponse);
收到的编译错误:
The method msearch(MsearchRequest, Class) is ambiguous for the type OpenSearchClient
错误原因
编译器无法通过ArgumentMatchers.any()这种无类型限制的匹配器,确定要匹配的msearch重载方法(OpenSearchClient存在多个参数签名相似的msearch重载),导致方法调用歧义。
解决方案
通过显式指定匹配器的参数类型消除编译器的歧义判断,常见两种实现方式:
方式1:指定匹配器的具体泛型类型
// 替换YourDocumentType为实际业务的文档类型 Mockito.when(client.msearch(ArgumentMatchers.any(MsearchRequest.class), ArgumentMatchers.<Class<YourDocumentType>>any())) .thenReturn(mSearchResponse);
方式2:使用doReturn语法(更简洁)
Mockito.doReturn(mSearchResponse) .when(client) .msearch(ArgumentMatchers.any(MsearchRequest.class), ArgumentMatchers.any(Class.class));
扩展到bulk方法
如果Mockbulk方法时遇到同样的歧义问题,逻辑完全一致:显式指定每个参数对应的匹配器类型,示例如下:
// 假设bulk方法签名为 bulk(BulkRequest request) Mockito.when(client.bulk(ArgumentMatchers.any(BulkRequest.class))) .thenReturn(bulkResponse);
内容的提问来源于stack exchange,提问作者VinayakC
相关产品推荐
相关产品推荐

