Elasticsearch Springboot Integration Test - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь добавить встроенный упругопоиск в свой тест интеграции с весенней загрузкой. Проблема здесь в том, что инициализация узла не работает вместе с весенней загрузкой, так как оба должны использовать разные тестовые программы.

Это ошибка, которую я получаю:

java.lang.IllegalStateException: нет контекстной информации для потока: Thread [id = 1, name = main, state = RUNNABLE, group = main]. Этот поток работает под классом com.carrotsearch.randomizedtesting.RandomizedRunner контекст бегуна? Добавьте @RunWith (класс com.carrotsearch.randomizedtesting.RandomizedRunner.class) в свой тестовый класс. Убедитесь, что ваш код обращается к случайным контекстам в пределах границ @BeforeClass и @AfterClass (например, инициализаторам статических тестовых классов не разрешен доступ к случайным контекстам).

Это мой класс:

@ActiveProfiles("test")
@Profile("test")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class})
public class ExampleTest extends AbstractElasticSearchIntegrationTest{



    @Autowired
    ExampleController exampleController;


    @Test
    public void deleteExample() throws Exception {
        assert(exampleController.delete("foo",
            "bar",
            null)).equals(new ResponseEntity<DefaultResponse> . 
       (HttpStatus.OK));
    }

}

Мой встроенный классasticsearch похож на этот:

@Slf4j
@Configuration
@Profile("test")
public class EmbeddedElasticSearchServer {

private static final String DEFAULT_DATA_DIRECTORY = "target/elasticsearch-data";

private static final String NODE_LOCAL_PROP = "node.local";
private static final String CLUSTER_NAME_PROP = "cluster.name";
private static final String INDEX_GATEWAY_TYPE_PROP = "index.gateway.type";
private static final String PATH_HOME_PROP = "path.home";
private static final String PATH_DATA_PROP = "path.data";
private static final String HTTP_ENABLED_PROP = "http.enabled";

private static final String DEFAULT_DATA_DIR = "target/es-data";
private static final String DEFAULT_CLUSTER = "cluster";

private Node node;
private String dataDirectory;

public EmbeddedElasticSearchServer() {
    this(DEFAULT_DATA_DIRECTORY);
}

public EmbeddedElasticSearchServer(String dataDirectory) {
    this.dataDirectory = dataDirectory;

    Settings elasticsearchSettings = Settings.builder()
            .put(PATH_HOME_PROP, "target")
            .put("http.type", "netty4")
            .put(PATH_DATA_PROP, dataDirectory.toString())
            .put(CLUSTER_NAME_PROP, DEFAULT_CLUSTER)
            .put("http.port", 4040)
            .put("transport.type", "netty4")
            .build();

    try {
        Collection plugins = Arrays.asList(Netty4Plugin.class);
        node = new PluginConfigurableNode(elasticsearchSettings, plugins).start();

    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

public Client getClient() {
    return node.client();
}

public RestClient getRestClient() {
    RestClient restClient = getRestClientBuilder().build();
    return restClient;
}

private RestClientBuilder getRestClientBuilder() {
    RestClientBuilder restClientBuilder =  RestClient.builder(new HttpHost("localhost", 4040, "http"))
            .setRequestConfigCallback((b) -> customizedRequestConfig(b))
            .setHttpClientConfigCallback((b) -> customizedHttpClientConfig(b))
            .setMaxRetryTimeoutMillis(5000);
    return restClientBuilder;
}
public RestHighLevelClient getRestHighLevelClient() {
    RestHighLevelClient restHighLevelClient = new RestHighLevelClient(getRestClientBuilder());
    return restHighLevelClient;
}
private RequestConfig.Builder customizedRequestConfig(RequestConfig.Builder builder) {
    return builder
            .setConnectionRequestTimeout( 0 ) 
            .setSocketTimeout(5000)
            .setConnectTimeout(5000 );
}


private HttpAsyncClientBuilder customizedHttpClientConfig(HttpAsyncClientBuilder builder) {
    log.info("Setting connection pool, maximum connection {}", 200);
    builder.setMaxConnPerRoute(20)
            .setMaxConnTotal(200);
    return builder;
}

@AfterClass
public void shutdown() {
    try {
        node.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    deleteDataDirectory();
}

@AfterClass
private void deleteDataDirectory() {
    try {
        FileUtils.deleteDirectory(new java.io.File(dataDirectory));
    } catch (IOException e) {
        throw new RuntimeException("Could not delete data directory of embedded elasticsearch server", e);
    }
}

private static class PluginConfigurableNode extends Node {
    public PluginConfigurableNode(Settings settings, Collection<Class<? extends Plugin>> classpathPlugins) {
        super(InternalSettingsPreparer.prepareEnvironment(settings, null), classpathPlugins);
    }
}

Теперь тест запустится, если не для SpringJUnit4Runner, но это требуется для инициализации bean-компонентов, необходимых для приложения.

Другим ограничением, которого я должен придерживаться, является то, что один из bean-компонентов, которые должны быть инициализированы в приложении, должен подключаться к встроенному эластичному поиску для инициализации. Итак, есть ли способ решить обе проблемы?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...