ElasticSearch在内存中进行测试

Mic*_*ech 16 java integration-testing elasticsearch

我想写一些与ElasticSearch的集成.为了测试,我想运行内存ES.

我在文档中找到了一些信息,但没有示例如何编写这类测试.Elasticsearch参考[1.6]»测试»Java测试框架»集成测试«单元测试

我还发现了以下文章,但它没有数据.使用Elastic Search轻松进行JUnit测试

我看一下如何在内存中启动和运行ES并通过REST API访问它.

Tim*_*aer 7

根据您提供的第二个链接,我创建了这个抽象测试类:

@RunWith(SpringJUnit4ClassRunner.class)
public abstract class AbstractElasticsearchTest {

    private static final String HTTP_PORT = "9205";
    private static final String HTTP_TRANSPORT_PORT = "9305";
    private static final String ES_WORKING_DIR = "target/es";

    private static Node node;

    @BeforeClass
    public static void startElasticsearch() throws Exception {    
        removeOldDataDir(ES_WORKING_DIR + "/" + clusterName);

        Settings settings = Settings.builder()
                .put("path.home", ES_WORKING_DIR)
                .put("path.conf", ES_WORKING_DIR)
                .put("path.data", ES_WORKING_DIR)
                .put("path.work", ES_WORKING_DIR)
                .put("path.logs", ES_WORKING_DIR)
                .put("http.port", HTTP_PORT)
                .put("transport.tcp.port", HTTP_TRANSPORT_PORT)
                .put("index.number_of_shards", "1")
                .put("index.number_of_replicas", "0")
                .put("discovery.zen.ping.multicast.enabled", "false")
                .build();
        node = nodeBuilder().settings(settings).clusterName("monkeys.elasticsearch").client(false).node();
        node.start();
    }

    @AfterClass
    public static void stopElasticsearch() {
        node.close();
    }

    private static void removeOldDataDir(String datadir) throws Exception {
        File dataDir = new File(datadir);
        if (dataDir.exists()) {
            FileSystemUtils.deleteRecursively(dataDir);
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

在生产代码中,我按如下方式配置了Elasticsearch客户端.集成测试扩展了上面定义的抽象类,并将属性配置elasticsearch.port为as 9305elasticsearch.hostas localhost.

@Configuration
public class ElasticsearchConfiguration {    
    @Bean(destroyMethod = "close")
    public Client elasticsearchClient(@Value("${elasticsearch.clusterName}") String clusterName,
                                      @Value("${elasticsearch.host}") String elasticsearchClusterHost,
                                      @Value("${elasticsearch.port}") Integer elasticsearchClusterPort) throws UnknownHostException {
        Settings settings = Settings.settingsBuilder().put("cluster.name", clusterName).build();
        InetSocketTransportAddress transportAddress = new InetSocketTransportAddress(InetAddress.getByName(elasticsearchClusterHost), elasticsearchClusterPort);
        return TransportClient.builder().settings(settings).build().addTransportAddress(transportAddress);
    }
}
Run Code Online (Sandbox Code Playgroud)

而已.集成测试将运行生产代码,该代码配置为连接到在该节点中启动的节点AbstractElasticsearchTest.startElasticsearch().

如果您想使用elasticsearch REST api,请使用端口9205.例如,使用Apache HttpComponents:

HttpClient httpClient = HttpClients.createDefault();
HttpPut httpPut = new HttpPut("http://localhost:9205/_template/" + templateName);
httpPut.setEntity(new FileEntity(new File("template.json")));
httpClient.execute(httpPut);
Run Code Online (Sandbox Code Playgroud)