单元测试之 elastic search

单元测试之 elastic search,第1张

单元测试之 elastic search

今日写elastic search 第三方组件相关的单元测试遇到了比较大麻烦,也花了很长时间通过单元测试与代码覆盖率指标。博主测试框架用的是mockito,难点在于需要屏蔽第三方依赖自己构造ES的返回SearchResponse 对象,直接用json赋值SearchResponse 是走不通的,只能通过内部API来赋值创建。废话不多说,直接上干货

    使用ES REST API获取你要封装的Response对象,注意后面typed_keys是必须的,否则无法解析拿到的json。(至于原因,请移步官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html#/return-agg-type)
    https://xxx:xx/index_name/_search?typed_keys
    
    解析JSON
// 步骤1得到的json
 String json= "{"a":2}";
 SearchResponse searchResponse2 =
            SearchResponse.fromXContent(new JsonXContentParser(getDefaultNamedXContentRegistry(),
                null, new JsonFactory().createParser(json)));
  private List getDefaultNamedXContents() {
  // 解析es返回的字段,其中不需要的可以自行删除
        Map> map = new HashMap<>();
        map.put("cardinality", (p, c) -> ParsedCardinality.fromXContent(p, (String) c));
        map.put("hdr_percentiles", (p, c) -> ParsedHDRPercentiles.fromXContent(p, (String) c));
        map.put("hdr_percentile_ranks", (p, c) -> ParsedHDRPercentileRanks.fromXContent(p, (String) c));
        map.put("tdigest_percentiles", (p, c) -> ParsedTDigestPercentiles.fromXContent(p, (String) c));
        map.put("tdigest_percentile_ranks", (p, c) -> ParsedTDigestPercentileRanks.fromXContent(p, (String) c));
        map.put("percentiles_bucket", (p, c) -> ParsedPercentilesBucket.fromXContent(p, (String) c));
        map.put("min", (p, c) -> ParsedMin.fromXContent(p, (String) c));
        map.put("max", (p, c) -> ParsedMax.fromXContent(p, (String) c));
        map.put("sum", (p, c) -> ParsedSum.fromXContent(p, (String) c));
        map.put("avg", (p, c) -> ParsedAvg.fromXContent(p, (String) c));
        map.put("value_count", (p, c) -> ParsedValueCount.fromXContent(p, (String) c));
        map.put("simple_value", (p, c) -> ParsedSimplevalue.fromXContent(p, (String) c));
        map.put("derivative", (p, c) -> ParsedDerivative.fromXContent(p, (String) c));
        map.put("bucket_metric_value", (p, c) -> ParsedBucketMetricValue.fromXContent(p, (String) c));
        map.put("stats", (p, c) -> ParsedStats.fromXContent(p, (String) c));
        map.put("stats_bucket", (p, c) -> ParsedStatsBucket.fromXContent(p, (String) c));
        map.put("extended_stats", (p, c) -> ParsedExtendedStats.fromXContent(p, (String) c));
        map.put("extended_stats_bucket", (p, c) -> ParsedExtendedStatsBucket.fromXContent(p, (String) c));
        map.put("geo_bounds", (p, c) -> ParsedGeoBounds.fromXContent(p, (String) c));
        map.put("geo_centroid", (p, c) -> ParsedGeoCentroid.fromXContent(p, (String) c));
        map.put("histogram", (p, c) -> ParsedHistogram.fromXContent(p, (String) c));
        map.put("date_histogram", (p, c) -> ParsedDateHistogram.fromXContent(p, (String) c));
        map.put("sterms", (p, c) -> ParsedStringTerms.fromXContent(p, (String) c));
        map.put("lterms", (p, c) -> ParsedLongTerms.fromXContent(p, (String) c));
        map.put("dterms", (p, c) -> ParsedDoubleTerms.fromXContent(p, (String) c));
        map.put("missing", (p, c) -> ParsedMissing.fromXContent(p, (String) c));
        map.put("nested", (p, c) -> ParsedNested.fromXContent(p, (String) c));
        map.put("reverse_nested", (p, c) -> ParsedReverseNested.fromXContent(p, (String) c));
        map.put("global", (p, c) -> ParsedGlobal.fromXContent(p, (String) c));
        map.put("filter", (p, c) -> ParsedFilter.fromXContent(p, (String) c));
        map.put("sampler", (p, c) -> ParsedSampler.fromXContent(p, (String) c));
        map.put("geohash_grid", (p, c) -> ParsedGeoHashGrid.fromXContent(p, (String) c));
        map.put("range", (p, c) -> ParsedRange.fromXContent(p, (String) c));
        map.put("date_range", (p, c) -> ParsedDateRange.fromXContent(p, (String) c));
        map.put("geo_distance", (p, c) -> ParsedGeoDistance.fromXContent(p, (String) c));
        map.put("filters", (p, c) -> ParsedFilters.fromXContent(p, (String) c));
        map.put("adjacency_matrix", (p, c) -> ParsedAdjacencyMatrix.fromXContent(p, (String) c));
        map.put("siglterms", (p, c) -> ParsedSignificantLongTerms.fromXContent(p, (String) c));
        map.put("sigsterms", (p, c) -> ParsedSignificantStringTerms.fromXContent(p, (String) c));
        map.put("scripted_metric", (p, c) -> ParsedscriptedMetric.fromXContent(p, (String) c));
        map.put("ip_range", (p, c) -> ParsedBinaryRange.fromXContent(p, (String) c));
        map.put("top_hits", (p, c) -> ParsedTopHits.fromXContent(p, (String) c));
        map.put("composite", (p, c) -> ParsedComposite.fromXContent(p, (String) c));
        List entries = map.entrySet().stream()
            .map((entry) -> new NamedXContentRegistry.Entry(Aggregation.class, new ParseField((String) entry.getKey()), entry.getValue()))
            .collect(Collectors.toList());
        entries.add(new NamedXContentRegistry.Entry(Suggest.Suggestion.class, new ParseField("term"), (parser, context) -> TermSuggestion.fromXContent(parser, (String) context)));
        entries.add(new NamedXContentRegistry.Entry(Suggest.Suggestion.class, new ParseField("phrase"), (parser, context) -> PhraseSuggestion.fromXContent(parser, (String) context)));
        entries.add(new NamedXContentRegistry.Entry(Suggest.Suggestion.class, new ParseField("completion"), (parser, context) -> CompletionSuggestion.fromXContent(parser, (String) context)));
        return entries;
    }
    
    private List getProvidedNamedXContents() {
        List entries = new ArrayList<>();
        
        for (NamedXContentProvider service : ServiceLoader.load(NamedXContentProvider.class)) {
            entries.addAll(service.getNamedXContentParsers());
        }
        
        return entries;
    }
    
    private NamedXContentRegistry getDefaultNamedXContentRegistry() {
        List entries = new ArrayList<>();
        entries.addAll(getDefaultNamedXContents());
        entries.addAll(getProvidedNamedXContents());
        return new NamedXContentRegistry(entries);
    }
    愉快的使用response对象
 when(client.search(any(), any())).thenReturn(searchResponse);
 // AssertXXX

4.依赖


            junit
            junit
            4.11
        

        
            org.powermock
            powermock-module-junit4
            test
        
        
            org.powermock
            powermock-api-mockito2
            2.0.9
            test
        

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5718291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存