elasticsearch,spring-boot,integration-testing,Java,elasticsearch,Spring Boot,Integration Testing" /> elasticsearch,spring-boot,integration-testing,Java,elasticsearch,Spring Boot,Integration Testing" />

Java Elasticsearch弹簧靴集成测试

Java Elasticsearch弹簧靴集成测试,java,elasticsearch,spring-boot,integration-testing,Java,elasticsearch,Spring Boot,Integration Testing,我正在寻找将嵌入式elasticsearch添加到spring boot集成测试中的方法 我研究了弹性搜索集成测试,但它不能与SpringBoot一起工作,因为两者应该使用不同的测试运行程序 我有一个类测试,如下所示,不幸的是,它不工作,错误: java.lang.IllegalStateException:没有线程的上下文信息: 线程[id=1,name=main,state=RUNNABLE,group=main]。这是线吗 在教室里跑步 com.carrotsearch.randomize

我正在寻找将嵌入式elasticsearch添加到spring boot集成测试中的方法

我研究了弹性搜索集成测试,但它不能与SpringBoot一起工作,因为两者应该使用不同的测试运行程序

我有一个类测试,如下所示,不幸的是,它不工作,错误:

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(类=App.class)
@WebAppConfiguration
@IntegrationTest(“服务器端口:0”)
公共类测试示例扩展ElasticsearchIntegrationTest{
TestRestTemplate TestRestTemplate=新的TestRestTemplate();
@值(${local.server.port}”)
国际港口;
@试验
公共void testOne(){
ResponseEntity结果=testRestTemplate.getForEntity(String.format(“http://localhost:%d/client/1“,端口),字符串。类);
系统输出打印(结果);
}
}

有没有人知道如何让它们运行,或者什么是替代方案???

您实际上可以做您需要的事情,而无需任何额外的elasticsearch测试依赖项。其基本思想是创建一个嵌入式节点,然后使用与它通信

为此,我创建了自己的
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;
    }

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

    @Autowired
    private Client elasticsearchClient;

    // Your rests go here...

}
然后,在spring配置中(我们称之为
integrationtestcontext.xml
),我这样做了:

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

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

这个怎么样?我已经看过了。首先我不使用spring数据,其次我需要嵌入式版本的ES。非常感谢您的回答。我会尝试一下,然后接受答案。:)这个答案对我帮助很大。我花了一整天的时间试图制作一个版本的org.elasticsearch.test.InternalTestCluster,我可以将它嵌入一个JerseyTest中。这使事情变得容易多了。需要注意的一点是,确保在某个位置关闭节点和客户端。它们需要清理。如果对其他人有帮助,这只在path.data是绝对路径(使用ES 1.7.3)时对我有效。根据,NodeBuilder已被删除,应该直接使用Node类。如果在集成测试中使用Node client,则无法创建ElasticSearchCrudepository bean。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/integration-test-context.xml")
public abstract class AbstractElasticsearchIntegrationTest {

    @Autowired
    private Client elasticsearchClient;

    // Your rests go here...

}