【问题标题】:How to prevent RestHighLevelClient from connecting to elasticsearch while creating a bean for test创建用于测试的bean时如何防止RestHighLevelClient连接到elasticsearch
【发布时间】:2022-01-26 23:02:33
【问题描述】:

我有一个创建RestHighLevelClientElasticsearchOperations 的配置类,当我启动应用程序时它们工作得很好。不幸的是,我遇到了测试问题。

我的配置类:

@ComponentScan(basePackages = "com.XXX.search")
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.XXX.search.index.repository")
public class RestHighLevelClientConfiguration {

    @Value("${elasticsearch.host:localhost}")
    private String host;

    @Value("${elasticsearch.port:9201}")
    private Integer port;

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }

    @Bean
    RestHighLevelClient client() {
        final RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)).setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
                @Override
                public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                    return requestConfigBuilder.setConnectTimeout(5000).setSocketTimeout(60000);
                }
            });

        return new RestHighLevelClient(builder);
    }
}

这是一个失败的测试类:

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = Application.class)
@TestPropertySource(locations = "classpath:test.properties")
public class ApplicationTest {
    
    @Test
    public void applicationContextLoads() {
        // nothing to add here.
    }
}

Maven 依赖:

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.12.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
        <version>4.3.0</version>
    </dependency>

当我运行上述测试时,我得到以下异常:

        Caused by: org.springframework.dao.DataAccessResourceFailureException: Connection refused; nested exception is java.lang.RuntimeException: Connection refused
        at org.springframework.data.elasticsearch.core.ElasticsearchExceptionTranslator.translateExceptionIfPossible(ElasticsearchExceptionTranslator.java:75)
        at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.translateException(ElasticsearchRestTemplate.java:402)
        at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.execute(ElasticsearchRestTemplate.java:385)
        at org.springframework.data.elasticsearch.core.DefaultIndexOperations.doExists(DefaultIndexOperations.java:107)
        at org.springframework.data.elasticsearch.core.AbstractDefaultIndexOperations.exists(AbstractDefaultIndexOperations.java:141)
        at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.<init>(SimpleElasticsearchRepository.java:93)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:208)
        ... 95 common frames omitted
        Caused by: java.lang.RuntimeException: Connection refused
        at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.translateException(ElasticsearchRestTemplate.java:400)
        ... 104 common frames omitted
        Caused by: java.net.ConnectException: Connection refused
        at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:880)
        at org.elasticsearch.client.RestClient.performRequest(RestClient.java:283)
        at org.elasticsearch.client.RestClient.performRequest(RestClient.java:270)
        at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1654)
        at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1639)
        at org.elasticsearch.client.IndicesClient.exists(IndicesClient.java:963)
        at org.springframework.data.elasticsearch.core.DefaultIndexOperations.lambda$doExists$2(DefaultIndexOperations.java:107)
        at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.execute(ElasticsearchRestTemplate.java:383)
        ... 103 common frames omitted
        Caused by: java.net.ConnectException: Connection refused
        at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
        at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:174)
        at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:148)
        at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:351)
        at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221)
        at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64)
        at java.lang.Thread.run(Thread.java:748)

如果有任何帮助,我将不胜感激。谢谢。

【问题讨论】:

    标签: spring-boot elasticsearch spring-data-elasticsearch resthighlevelclient


    【解决方案1】:

    ElasticsearchOperations 实现和客户端不会自动连接到 Elasticsearch 集群。

    当为它们定义的实体将createIndex 属性设置为true(这是默认值)时,自动连接的是ElasticsearchRepository 实例。

    因此,如果您不需要存储库,则应从测试设置中排除它们 - 或者您可以提供 Elasticsearch 进行测试,例如使用 TestContainers

    【讨论】:

    • 谢谢,我在@Document 注释中设置了createIndex = false 并且测试没有失败。我认为这种情况下可以自动跳过文档映射的创建。
    • 您还知道如何从测试设置中排除存储库吗?
    • 取决于您要测试的内容。例如,如果您正在测试一个注入了存储库的控制器,那么您必须模拟该存储库以防止创建存储库实例。
    猜你喜欢
    • 2018-04-01
    • 2021-08-11
    • 2023-03-05
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多