web-dev-qa-db-ja.com

ElasticsearchSpringブート統合テスト

埋め込みelasticsearchをSpringBoot統合テストに追加する方法を探しています。

Elastic Search統合テストを調べましたが、両方が異なるテストランナーを使用する必要があるため、SpringBootと一緒に機能しません。

私は以下のようなクラステストを持っていますが、残念ながらそれはエラーで動作しません:

Java.lang.IllegalStateException:スレッドのコンテキスト情報がありません:Thread [id = 1、name = main、state = RUNNABLE、group = main]。このスレッドは、com.carrotsearch.randomizedtesting.RandomizedRunnerランナーコンテキストクラスで実行されていますか? @RunWith(class 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);
    }

}

誰かがそれらを実行させる方法や代替手段は何ですか?

14
Jaroslaw.zawila

Elasticsearchテストの依存関係を追加しなくても、実際に必要なことを実行できます。基本的には、埋め込みノードを作成し、 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...

}
10
npe