如何模拟数据库的行为

时间:2018-03-05 18:16:25

标签: java junit

我正在尝试使用JUnits测试将数据持久保存到elasticsearch的功能。这是我第一次使用JUnits,这是我的第一次测试用例。

我有一个类似下面的界面

public interface ElasticSearchIndexer {

    void writeTo(String inputJson) throws IOException;
}

接口由多个类实现。示例实现如下所示

public class HardwareEOXIndexer implements ElasticSearchIndexer {
    private static final Logger logger = LoggerFactory.getLogger(HardwareEOXIndexer.class);
    private final String es_index = "/hardwareeox/inv/";

    private String hostname;

    public HardwareEOXIndexer(String hostname) {
        this.hostname = hostname;
    }

    public void writeTo(String inputJson) throws IOException {
        ReadContext ctx = JsonPath.parse(inputJson);
        String hardwareEOXId = Integer.toString(ctx.read("$.EoXBulletin.items[0].hardwareEOXId"));

        StringBuilder documentID = new StringBuilder().append(hardwareEOXId);
        logger.info("Indexing the document with ID :: {} ", documentID.toString());
        try {
            new ElasticSearchContext().getContext(hostname, inputJson, es_index, documentID);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("HardwareEOXIndexer : es_index: " + es_index + " ------> " + e.getMessage());
        }
    }

}

如何模拟elasticsearch的行为以及如何编写单元测试。

1 个答案:

答案 0 :(得分:1)

接口部分在问题中是假的,核心点是:

  

如何模拟elasticsearch的行为以及如何编写单元测试。

基本上有两个答案:

  • 您创建了一个抽象图层,隐藏了ElasticSearch的详细信息。含义:您可以创建自己类的对象(不是通过 new 创建,而是通过工厂对象创建),而不是创建新的ElasticSearch对象。
  • 您了解了PowerMock,以及如何使用它来模拟对new的调用。

我绝对建议您选择第一个选项:因为这会改善您的设计。你知道,为什么你要将所有代码紧密地耦合到弹性搜索?但是假设这个实现已经被认为是围绕弹性搜索的抽象层 - 那么你仍然应该使用依赖注入来获取实际调用方法所需的ElasticSearch对象。如上所述,使用工厂或真正的DI框架。这将允许你说"简单"模拟框架,如Mockito或EasyMock。