SpringBoot、elasticsearch和testcontainers集成测试连接被拒绝

kg7wmglp  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(592)

我创建了一个集成测试,用于从elasticsearch检索数据。
我正在使用testcontainer的默认值,这样我的resthighlevelclient应该可以访问测试容器,但是每次我都得到相同的异常( java.net.ConnecteException: Connection refused )当我试图索引数据时,但是当我在本地运行命令时,docker映像

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

我的测试正常。
问题出在哪里,因为端口Map是相同的?这个例外的原因是什么?
我的测试:

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

sqxo8psd1#

除非配置不同,否则默认端口为9200。因此,如果您的客户端尝试连接到默认端口,则需要确保9200可用,以便可以在该端口上启动testcontainers中的elasticsearch。
我猜elasticsearch还没有足够的时间启动。这是一个java进程,可能需要一些时间-在我的机器上大约20秒。你可能需要设置一个等待策略;像这样:

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

dffbzjpn2#

如果我记得很清楚,您可以使用以下命令请求暴露的端口:

esContainer.getMappedPort(ELASTICSEARCH_PORT);

docker容器公开了一个随机可用的端口,因此请按照前面提到的命令检查该端口。为客户端使用该端口。我的一位同事写了一篇关于这一点的博客文章,如果您感兴趣,可以提供一些示例代码:https://amsterdam.luminis.eu/2018/08/20/elasticsearch-instances-for-integration-testing/

相关问题