单元测试ElasticSearch搜索结果转换器

时间:2016-03-14 13:16:32

标签: java unit-testing elasticsearch junit

在我们的项目中,我编写了一个小类,旨在从包含命名聚合的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.javasource),但没有关于如何使用此类的指导,而且我没有我不相信它是针对这种情况的。

如何以一种在未来的ES版本中不太可能破解的方式轻松地对这个类进行单元测试?

注意,我不想启动ElasticSearch的实例,嵌入式或其他方式,因为这对于这个简单的单元测试来说是过度的,并且会显着减慢执行速度。

0 个答案:

没有答案