首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointerException问题在模拟弹性搜索的RestHighLevelClient时

NullPointerException问题在模拟弹性搜索的RestHighLevelClient时
EN

Stack Overflow用户
提问于 2019-11-18 12:12:38
回答 3查看 4.2K关注 0票数 3

在单元测试期间,当我试图在一个NullPointerException类中测试和模拟一个RestHighLevelClient时,我将面对一个ElasticClient

代码语言:javascript
复制
@Configuration
@NoArgsConstructor
public class ElasticClient{

   @Setter
   private RestHighLevelClient restHighLevelClient;

    @PostConstruct
    public void buildRestHighLevelClient(){

        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(
                "127.0.0.1",
                9200, "http")
        );

        restClientBuilder.setRequestConfigCallback(
                requestConfigBuilder ->
                        requestConfigBuilder
                                .setConnectTimeout(500000)
                                .setSocketTimeout(600000)
                                .setConnectionRequestTimeout(0)
        )
                .setHttpClientConfigCallback(
                        httpClientBuilder ->
                                httpClientBuilder
                                        .setMaxConnPerRoute(2048)
                );

        restHighLevelClient = new RestHighLevelClient(restClientBuilder);
    }

   public boolean isReachable(){
     return restHighLevelClient.ping(RequestOptions.DEFAULT);
   }

}

而考试班:

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class ElasticClientTest{

@Mock
private RestHighLevelClient restHighLevelClient;


ElasticClient elasticClient;

@Before
public void init(){

    elasticClient = new ElasticClient();
    elasticClient.setRestHighLevelClient(restHighLevelClient);

}

NullPointerException来自这里:

代码语言:javascript
复制
    @Test
    public void whenElasticIsPingable_thenReturnTrue() throws IOException{

           when(restHighLevelClient.ping(RequestOptions.DEFAULT)).thenReturn(true);
           Assertions.assertThat(elasticClient.isReachable()).isTrue();
    }

下面是堆栈跟踪:

代码语言:javascript
复制
java.lang.NullPointerException
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1764)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1734)
at org.elasticsearch.client.RestHighLevelClient.ping(RestHighLevelClient.java:694)
at com.example.ElasticClientTest.whenElasticIsPingable_thenReturnTrue(ElasticClientTest.java:44)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-18 14:30:14

这个问题源于这样一个事实:RestHighLevelClient中的RestHighLevelClient方法是final,不能定期地进行模拟。

因此,我使用了这个例子关于PowerMock的帮助。

最后的结果是:

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)
@PrepareForTest(RestHighLevelClient.class)
public class ElasticClientTest{

ElasticClient elasticClient;

RestHighLevelClient restHighLevelClient;

@Before
public void init(){

    restHighLevelClient = mock(RestHighLevelClient.class);

    elasticClient = new ElasticClient();
    elasticClient.setRestHighLevelClient(restHighLevelClient);

}


@Test
public void whenElasticIsPingable_thenReturnTrue() throws IOException{

    when(restHighLevelClient.ping(RequestOptions.DEFAULT)).thenReturn(true);

    Assertions.assertThat(elasticClient.isReachable()).isTrue();
}
票数 3
EN

Stack Overflow用户

发布于 2019-11-18 12:16:56

尝试:

代码语言:javascript
复制
when(restHighLevelClient.ping(eq(RequestOptions.DEFAULT))).thenReturn(true);
票数 0
EN

Stack Overflow用户

发布于 2022-02-04 13:08:19

您需要添加一个mockito扩展,以便使用以下步骤来模拟一个最终的对象:

  1. 在“测试资源”文件夹中创建一个名为“mockito扩展”的文件夹。
  2. 在文件夹中添加一个名为"org.mockito.plugins.MockMaker“的文件。
  3. 在该文件中,写“模拟制造者-内联”。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58914298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档