Весенние загрузочные тесты, тесты интеграции ElasticSearch и TestContainers.В соединении отказано - PullRequest
0 голосов
/ 03 января 2019

Я создаю интеграционный тест для извлечения данных изasticsearch.

Я использую значения по умолчанию для testContainer, поэтому мой RestHighLevelClient должен иметь доступ к тестовому контейнеру, но все время получаю одно и то же исключение (java.net.ConnecteException: Connection refused), когда пытаюсь индексировать данные, но когда язапустить мой локальный образ докера командой

docker run -d --rm -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "transport.host=127.0.0.1"  --name elastic docker.elastic.co/elasticsearch/elasticsearch:6.5.4

мой тест работает правильно.

Где проблема, потому что сопоставление портов одинаково?В чем причина этого исключения?

Мой тест:

@ExtendWith(SpringExtension.class)
@Testcontainers
@WebMvcTest
class FlowerResourceTest {

    @Container
    private ElasticsearchContainer esContainer = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:6.5.4");

    @Autowired
    private ElasticsearchConfiguration esConfig;

    @Autowired
    private FlowerService flowerService;

    private RestHighLevelClient client;


    @Test
    void test() throws IOException, InterruptedException {
        client = esConfig.client();

        var jsonFlower = "{\n" +
                "    \"name\": \"XXX\",\n" +
                "  \"color\" : \"red\"\n" +
                "}";
        IndexRequest indexRequest = new IndexRequest("flowers", "doc", "1")
                .source(jsonFlower, XContentType.JSON);


        assertTrue(esContainer.isRunning());
        client.index(indexRequest, RequestOptions.DEFAULT);


        var flowers = flowerService.findAll();


        assertTrue(flowers.size() > 0);

        DeleteRequest deleteRequest = new DeleteRequest("flowers", "doc", "1");

        client.delete(deleteRequest, RequestOptions.DEFAULT);
    }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Если я хорошо помню, вы можете запросить незащищенный порт, используя следующую команду:

esContainer.getMappedPort(ELASTICSEARCH_PORT);

Контейнер Docker предоставляет произвольно доступный порт, поэтому проверьте порт, как с упомянутой командой.Используйте этот порт для клиента.Мой коллега написал в блоге об этом пример кода, если вам интересно: https://amsterdam.luminis.eu/2018/08/20/elasticsearch-instances-for-integration-testing/

0 голосов
/ 05 января 2019
  1. Если вы не настроите его по-другому, порт по умолчанию - 9200. Поэтому, если ваш клиент пытается подключиться к стандартному, вам нужно убедиться, что 9200 доступен, чтобы Elasticsearch в Testcontainers мог быть запущен на этомport.
  2. Я думаю, у Elasticsearch не было достаточно времени для запуска.Это процесс Java, и может потребоваться некоторое время - на моей машине около 20 лет.Возможно, вы захотите установить стратегию ожидания;как то так:

    esContainer.setWaitStrategy(
            Wait.forHttp("/")
                    .forPort(9200)
                    .forStatusCode(200)
                    .withStartupTimeout(Duration.ofSeconds(60)));
    
...