在我们的项目中,我编写了一个小类,旨在从包含命名聚合的ElasticSearch查询中获取结果,并以中性格式返回结果中返回的每个桶的返回信息,适合传递给我们的UI。
public class AggsToSimpleChartBasicConverter {
private SearchResponse searchResponse;
private String aggregationName;
private static final Logger logger = LoggerFactory.getLogger(AggsToSimpleChartBasicConverter.class);
public AggsToSimpleChartBasicConverter(SearchResponse searchResponse, String aggregationName) {
this.searchResponse = searchResponse;
this.aggregationName = aggregationName;
}
public void setChartData(SimpleChartData chart,
BucketExtractors.BucketNameExtractor keyExtractor,
BucketExtractors.BucketValueExtractor valueExtractor) {
Aggregations aggregations = searchResponse.getAggregations();
Terms termsAggregation = aggregations.get(aggregationName);
if (termsAggregation != null) {
for (Terms.Bucket bucket : termsAggregation.getBuckets()) {
chart.add(keyExtractor.extractKey(bucket), Long.parseLong(valueExtractor.extractValue(bucket).toString()));
}
} else {
logger.warn("Aggregation " + aggregationName + " could not be found");
}
}
}
我想通过调用setChartData()
并对传入的对象执行一些断言来为这个类编写单元测试,因为它的机制相当简单。但是为了做到这一点,我需要构造一个包含一些测试数据的org.elasticsearch.action.search.SearchResponse
实例,这是我的类的构造函数所需要的。
我查看了实现类似于此existing question的解决方案,但是更多地涉及将聚合数据添加到结果的过程,并且需要使用私有内部类,这可能会在将来的版本中发生变化,即使我最初可以开始工作。
我查看了unit testing上的ElasticSearch文档,并提到了一个类org.elasticsearch.test.ESTestCase.java
(source),但没有关于如何使用此类的指导,而且我没有我不相信它是针对这种情况的。
如何以一种在未来的ES版本中不太可能破解的方式轻松地对这个类进行单元测试?
注意,我不想启动ElasticSearch的实例,嵌入式或其他方式,因为这对于这个简单的单元测试来说是过度的,并且会显着减慢执行速度。