如何构造带命中的SearchHits以覆盖Elasticsearch测试分支
测试分支覆盖实现方案
要触发for循环内的逻辑,只需构造包含至少1个SearchHit元素的SearchHits实例即可,具体实现如下:
最简单元测试实现(适配ES 7.x+版本)
直接构造带测试数据的SearchHits替换原有thenReturn参数:
// 提前Mock一个SearchHit实例,供后续map方法调用 @Mock private SearchHit mockSearchHit; // 构造非空的SearchHits实例 SearchHit[] hitArr = new SearchHit[]{mockSearchHit}; // 参数依次为:命中数组、命中总数对象、最高匹配得分 SearchHits nonEmptyHits = new SearchHits(hitArr, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0f); // 替换原有Mock配置 when(searchResponse.getHits()).thenReturn(nonEmptyHits);
适配ES 6.x及更早版本
旧版本ES的SearchHits构造不需要TotalHits对象,直接传命中数即可:
SearchHit[] hitArr = new SearchHit[]{mockSearchHit}; SearchHits nonEmptyHits = new SearchHits(hitArr, 1, 1.0f); when(searchResponse.getHits()).thenReturn(nonEmptyHits);
补充配置(可选)
如果你的map(SearchHit)方法需要读取SearchHit内的字段值,可以额外Mock对应方法的返回值:
// 模拟返回SearchHit存储的源数据 Map<String, Object> mockCarSource = new HashMap<>(); mockCarSource.put("id", 1001); mockCarSource.put("carName", "特斯拉Model 3"); mockCarSource.put("carType", "NEW_ENERGY"); when(mockSearchHit.getSourceAsMap()).thenReturn(mockCarSource);
内容的提问来源于stack exchange,提问作者JohnBenjamin
相关产品推荐
相关产品推荐

