尝试模拟 Elastic Search 的 RestHighLevelClient 时出现 NullPointerException 问题

问题描述 投票:0回答:4

我在单元测试期间遇到 NullPointerException,当尝试在

RestHighLevelClient
类中测试和模拟
ElasticClient
时:

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

}

还有测试班:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class ElasticClientTest{

@Mock
private RestHighLevelClient restHighLevelClient;


ElasticClient elasticClient;

@Before
public void init(){

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

}

NullPointerException 来自这里:

    @Test
    public void whenElasticIsPingable_thenReturnTrue() throws IOException{

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

这是堆栈跟踪:

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)
java spring spring-boot mockito resthighlevelclient
4个回答
3
投票

问题源于

ping
中的
RestHighLevelClient
方法是
final
,因为不能定期嘲笑。

所以,我使用了这个示例关于PowerMock

的帮助

最终结果:

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

2
投票

您需要添加一个mockito扩展来模拟最终对象,步骤如下:

  1. 在测试资源中创建一个名为“mockito-extensions”的文件夹 文件夹。
  2. 在其中添加一个名为“org.mockito.plugins.MockMaker”的文件 文件夹。
  3. 在该文件中,写入“mock-maker-inline”

0
投票

尝试:

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

0
投票
@Before
public void init() {

    restHighLevelClient = Mockito.mock(RestHighLevelClient.class);

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

}


@Test
public void whenElasticIsPingable_thenReturnTrue() throws IOException {

    Mockito.doReturn(true).when(restHighLevelClient).ping(RequestOptions.DEFAULT);

}

java.lang.NullPointerException 在 org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1613) 在 org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1598) 在 org.elasticsearch.client.RestHighLevelClient.ping(RestHighLevelClient.java:756) 在 stack.ElasticClientTest.whenElasticIsPingable_thenReturnTrue(ElasticClientTest.java:37) 不要修复这个问题

© www.soinside.com 2019 - 2024. All rights reserved.