Elasticsearch Spring 启动集成测试

Elasticsearch Spring boot integration test

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

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

我有一个 class 测试,不幸的是,它无法正常工作,但出现错误:

java.lang.IllegalStateException: No context information for thread: Thread[id=1, name=main, state=RUNNABLE, group=main]. Is this thread running under a class com.carrotsearch.randomizedtesting.RandomizedRunner runner context? Add @RunWith(class com.carrotsearch.randomizedtesting.RandomizedRunner.class) to your test class. Make sure your code accesses random contexts within @BeforeClass and @AfterClass boundary (for example, static test class initializers are not permitted to access random contexts).

@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);
    }

}

有没有人知道如何制作它们 运行 或者有什么替代品??

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

为此,我创建了自己的 EmbeddedElasticsearchServer class,它看起来(或多或少)像这样:

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...

}