今日写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 ListgetDefaultNamedXContents() { // 解析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 junit4.11 org.powermock powermock-module-junit4test org.powermock powermock-api-mockito22.0.9 test
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)