Elasticsearch Spring boot 集成测试

Posted

技术标签:

【中文标题】Elasticsearch Spring boot 集成测试【英文标题】:Elasticsearch Spring boot integration test 【发布时间】:2015-08-20 22:37:23 【问题描述】:

我正在寻找将嵌入式弹性搜索添加到我的 Spring Boot 集成测试的方法。

我查看了弹性搜索集成测试,但它不能与 spring boot 一起使用,因为两者都应该使用不同的测试运行器。

不幸的是,我有一个如下的类测试,它不能正常工作:

java.lang.IllegalStateException:没有线程的上下文信息: 线程[id=1,name=main,state=RUNNABLE,group=main]。这是线程 在一堂课下跑 com.carrotsearch.randomizedtesting.RandomizedRunner 跑步者上下文? 添加@RunWith(类 com.carrotsearch.randomizedtesting.RandomizedRunner.class) 到你的 测试班。确保您的代码访问其中的随机上下文 @BeforeClass 和@AfterClass 边界(例如,静态测试类 不允许初始化器访问随机上下文)。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
public class TestExample extends ElasticsearchIntegrationTest 

    TestRestTemplate testRestTemplate = new TestRestTemplate();

    @Value("$local.server.port")
    int port;

    @Test
    public void testOne()
        ResponseEntity<String> results = testRestTemplate.getForEntity(String.format("http://localhost:%d/client/1", port), String.class);



     System.out.print(results);
    


有没有人有一些想法如何让它们运行或有什么替代方案??

【问题讨论】:

这个怎么样:github.com/spring-projects/spring-boot/blob/master/…? 我已经看过了。首先我不使用spring-data,其次我需要ES的嵌入式版本。 【参考方案1】:

您实际上可以做您需要的事情,而无需任何额外的弹性搜索测试依赖项。这个想法基本上是创建一个嵌入式节点,然后使用NodeClient 与之通信。

为此,我创建了自己的 EmbeddedElasticsearchServer 类,看起来(或多或少)如下:

public class EmbeddedElasticsearchServer implements InitializingBean 

    public EmbeddedElasticsearchServer() 

        ImmutableSettings.Builder elasticsearchSettings = ImmutableSettings.settingsBuilder()
                .put("http.enabled", "false")
                .put("path.data", "target/elasticsearch-data");

        node = nodeBuilder()
                .local(true)
                .settings(elasticsearchSettings.build())
                .node();

        client = node.client();


    

    @Override
    public void afterPropertiesSet() throws Exception 
         // Initialization stuff:
         // - create required indices
         // - define mappings
         // - populate with test data
    

    public Client getClient() 
         return client;
    


然后,在 spring 配置中(我们称之为integration-test-context.xml)我这样做了:

<bean id="embeddedElasticsearchServer" 
      class="com.example.EmbeddedElasticsearchServer" />

<bean id="elasticsearchClient"
      class="org.elasticsearch.client.node.NodeClient" 
      factory-bean="embeddedElasticsearchServer" 
      factory-method="getClient" />

然后您可以像这样在测试中自动装配客户端:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/integration-test-context.xml")
public abstract class AbstractElasticsearchIntegrationTest 

    @Autowired
    private Client elasticsearchClient;

    // Your rests go here...


【讨论】:

非常感谢您的回答。之后我会尝试并接受答案。 :) 这个答案对我帮助很大。我花了一整天的时间尝试制作一个可以嵌入 JerseyTest 的 org.elasticsearch.test.InternalTestCluster 版本。这让事情变得容易多了。需要注意的一件事是确保在某处关闭节点和客户端。它们需要清理干净。 如果它对其他人有帮助,这仅在 path.data 是绝对路径(使用 ES 1.7.3)时对我有用。 根据the ElasticSearch pull requests的说法,NodeBuilder已经被移除,应该直接使用Node类。 如果在集成测试中使用节点客户端,则无法创建 ElasticsearchCrudRepository bean。

以上是关于Elasticsearch Spring boot 集成测试的主要内容,如果未能解决你的问题,请参考以下文章

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

ElasticSearch 副本-04Spring Boot 集成 ElasticSearch

spring boot 整合Elasticsearch

Spring Boot 与ElasticSearch

es 实战 —— spring boot 中使用 Elasticsearch

Spring-Boot整合Elasticsearch