0

我下面这个教程如何使用嵌入式ElasticSearch集成测试

  1. https://orrsella.com/2014/10/28/embedded-elasticsearch-server-for-scala-integration-tests/

所有我试图跟随链接,因为我使用ELasticSearch 1.6.0,但它的使用NodeClient,我想使用transportClient但我正在逐渐例外

org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [] 
[info] at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:305) 
[info] at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:200) 
[info] at org.elasticsearch.client.transport.support.InternalTransportIndicesAdminClient.execute(InternalTransportIndicesAdminClient.java:86) 
[info] at org.elasticsearch.client.support.AbstractIndicesAdminClient.create(AbstractIndicesAdminClient.java:367) 
[info] at org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder.doExecute(CreateIndexRequestBuilder.java:250) 
[info] at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:91) 
[info] at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:65) 
[info] at testcontrollers.campaign.ElasticsearchServer.createAndWaitForIndex(ElasticsearchServer.scala:40) 
[info] at testcontrollers.campaign.CampaignTestSearch.<init>(CampaignTestSearch.scala:41) 
[info] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

这里是代码

class ElasticsearchServer { 
    val log = LoggerFactory.getLogger(this.getClass) 
    private val clusterName = "testcluster" 
    private val dataDir = Files.createTempDirectory("elasticsearch_test_data_").toFile 
    private val settings = ImmutableSettings.settingsBuilder 
    .put("path.data", dataDir.toString) 
    .put("cluster.name", clusterName) 
    .put("node.local",true) 
    .build 

    def client: TransportClient ={ 
    val client=new TransportClient(settings) 
    .addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300)) 
    client 
    } 
    def stop(): Unit = { 
    client.close(); 

    try { 
     FileUtils.forceDelete(dataDir) 
    } catch { 
     case e: Exception => // dataDir cleanup failed 
    } 
    } 

    def createAndWaitForIndex(index: String): Unit = { 
     client.admin.indices.prepareCreate(index).execute.actionGet() 
     client.admin.cluster.prepareHealth(index).setWaitForActiveShards(1).execute.actionGet() 
    } 
} 

class CampaignTestSearch extends PlaySpec{ 
    val server = new ElasticsearchServer 
    server.createAndWaitForIndex("arteciatetestdb") 
val client=server.client 

val response = client.prepareSearch("dbtest") 
     .setTypes(CAMPAIGN_COLLECTION_NAME) 
     .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
     .addFields("uuid","campaignName","artworkID","activationDate","_source") 
     .setQuery(query) 
     .execute() 
     .actionGet() 
    } 

回答

1

首先您需要注意的是,较新版本的elasticsearch已经放弃使用嵌入的支持,原因在this blog post中描述。

有鉴于此,在许多版本的elasticsearch中,包括5您可以使用ESIntegTestCase支持类,并使您的集成测试类扩展它以支持嵌入式elasticsearch测试。您可以在their official documentation处阅读更多关于此的内容。

从他们的官方文档:

public class Mytests extends ESIntegTestCase { 

    @Override 
    protected Settings nodeSettings(int nodeOrdinal) { 
     return Settings.builder().put(super.nodeSettings(nodeOrdinal)) 
      .put("node.mode", "network") 
      .build(); 
    } 

} 

在1.x版本中有一个叫ElasticsearchTestCase类,将给予支持与弹性单元测试,检查this link on their official repository关于如何使用它的一个完整的例子。

+0

我现在无法升级到ES更新版本,所以有什么解决ES版本1.6.0的问题,目前我使用的是 – swaheed

+0

yes,但测试类的名称不同,请检查我上面更新的答案一个例子与他们的官方回购链接。 –

相关问题