首页 > 解决方案 > 无法完全模拟 RestHighLevelClient

问题描述

我需要模拟 RestHighLevelClient 来测试我的代码。基本上,当我调用 RestHighLevelClient 的“搜索”方法时,我得到 UnfinishedStubbingException 或 WrongTypeOfReturnValue。

PowerMockito.doReturn(searchResponse).when(client.search(searchRequest, RequestOptions.DEFAULT));

此示例引发 UnfinishedStubbingException。

PowerMockito.when(client.search(searchRequest, RequestOptions.DEFAULT)).thenReturn(searchResponse);

此示例抛出 WrongTypeOfReturnValue。

这是我的配置

@RunWith(PowerMockRunner.class)
@PrepareForTest(value = {
        RestHighLevelClient.class
...otherClasses
})

我用谷歌搜索了这两个例外,但是,我没有在“thenReturn”方法中调用“mock.someMethod()”。似乎每种方法都行不通。

标签: javaelasticsearchmockitopowermockito

解决方案


RestHighLevelClient在抽象中包装访问。使用与使用相同的签名RestHighLevelClient。最后,模拟抽象。例如:

public interface RestHighLevelClientWrapper {
    SearchResponse search(SearchRequest searchRequest, RequestOptions options) throws IOException;
}
@Service
public class RestHighLevelClientWrapperImpl implements RestHighLevelClientWrapper {

    private final RestHighLevelClient client;

    @Autowired
    public RestHighLevelClientWrapperImpl(RestHighLevelClient client) {
        this.client = client;
    }

    @Override
    public SearchResponse search(SearchRequest searchRequest, RequestOptions options) throws IOException {
        return client.search(searchRequest, options);
    }
}


推荐阅读