The idea is to start a standalone Elastic Search instance in the test. This way we don't have to make sure that every developer has access to Elastic Search instance running somewhere out of build's control. The downside of starting an instance inside test is that it may get quite slow to run the test. However, that's another problem to tackle.
I'm using Jersey HTTP client in this example to connect to Elastic Search. Any other client works as well.
Maven POM
Maven POM that's needed to execute my example.<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fi.elastic-search.test</groupId>
<artifactId>elastic-junit</artifactId>
<name>elastic-junit</name>
<packaging>jar</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>0.20.3</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.17</version>
</dependency>
</dependencies>
</project>
JUnit test code
Here's the Java code starting standalone Elastic Search instance and creating an index.import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.ws.rs.core.MediaType; import org.elasticsearch.common.io.FileSystemUtils; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.node.Node; import static org.elasticsearch.node.NodeBuilder.nodeBuilder; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.LoggingFilter; public class ElasticSearchTest { private Client client; private static String testIndexName = "junitindexname"; private static final String HTTP_BASE_URL = "http://localhost"; private static final String HTTP_PORT = "9205"; private static final String HTTP_TRANSPORT_PORT = "9305"; private static final String elasticSearchBaseUrl = HTTP_BASE_URL + ":" + HTTP_PORT; private static Node node; @BeforeClass public static void startElasticSearch() throws Exception { final String nodeName = "junittestnode"; MapsettingsMap = new HashMap (); // create all data directories under Maven build directory settingsMap.put("path.conf", "target"); settingsMap.put("path.data", "target"); settingsMap.put("path.work", "target"); settingsMap.put("path.logs", "target"); // set ports used by Elastic Search to something different than default settingsMap.put("http.port", HTTP_PORT); settingsMap.put("transport.tcp.port", HTTP_TRANSPORT_PORT); settingsMap.put("index.number_of_shards", "1"); settingsMap.put("index.number_of_replicas", "0"); // disable clustering settingsMap.put("discovery.zen.ping.multicast.enabled", "false"); // disable automatic index creation settingsMap.put("action.auto_create_index", "false"); // disable automatic type creation settingsMap.put("index.mapper.dynamic", "false"); removeOldDataDir("target/" + nodeName); Settings settings = ImmutableSettings.settingsBuilder() .put(settingsMap).build(); node = nodeBuilder().settings(settings).clusterName(nodeName) .client(false).node(); node.start(); } private static void removeOldDataDir(String datadir) throws Exception { File dataDir = new File(datadir); if (dataDir.exists()) { FileSystemUtils.deleteRecursively(dataDir, true); } } @AfterClass public static void stopElasticSearch() { node.close(); } @Before public void initialize() { // create client for each test ClientConfig clientConfig = new DefaultClientConfig(); client = Client.create(clientConfig); client.addFilter(new LoggingFilter(System.out)); } @Test public void testCreateIndex() { WebResource service = client.resource(elasticSearchBaseUrl); // check first that does the index already exist ClientResponse clientResponse = service.path(testIndexName).head(); if (clientResponse.getClientResponseStatus().equals(ClientResponse.Status.OK)) { Assert.fail("Index exists already"); } String indexJson = "{\"settings\" : {\"index\" : {\"number_of_shards\" : 1,\"number_of_replicas\" : 0}}}"; try { String response = service.path(testIndexName). queryParam("refresh", "true"). queryParam("timeout","5m"). accept(MediaType.APPLICATION_JSON). put(String.class, indexJson); if (!response.contains("ok")) { Assert.fail("Creating index failed. IndexName: " + testIndexName); } } catch (UniformInterfaceException e) { // failed due to Client side problem throw e; } // wait for Elastic Search to be ready for further processing HashMap statusParameters = new HashMap (); final String timeout = "30s"; statusParameters.put("timeout", timeout); statusParameters.put("wait_for_status", "green"); String statusResponse = status(statusParameters); if (statusResponse.contains("red")) { Assert.fail("Failed to create index"); } } public String status(final Map optionalParameters) { WebResource service = client.resource(elasticSearchBaseUrl); WebResource webResource = service.path("_cluster").path("/health"); for (Entry entry : optionalParameters.entrySet()) { webResource = webResource.queryParam(entry.getKey(),entry.getValue()); } return webResource.get(String.class); } }