Mock java elasticsearch RestHighLevelClient

192 Views Asked by At

I want to mock RestHighLevelClient like this: RestHighLevelClient client = mock(RestHighLevelClient.class);, but when I do, it says that mocked client is null. Like it's not properly mocking. So when i try:

        ActionsSearchRequest request = ActionsSearchRequest.builder()
                .merchSnapshot(merchSnapshot)
                .siteName(SiteName.COM)
                .searchPhrase("skirt")
                .build();
        SearchHit hit1 = new SearchHit(1);
        SearchHit hit2 = new SearchHit(2);

        SearchHits searchHits = new SearchHits(new SearchHit[]{hit1, hit2}, new TotalHits(2, TotalHits.Relation.EQUAL_TO), 1.0f);

        SearchResponse searchResponse = mock(SearchResponse.class);
        when(searchResponse.getHits()).thenReturn(searchHits);
        when(searchResponse.getTotalShards()).thenReturn(1);
        when(searchResponse.getSuccessfulShards()).thenReturn(1);
        when(searchResponse.getFailedShards()).thenReturn(0);
        when(searchResponse.getShardFailures()).thenReturn(null);
        when(searchResponse.isTimedOut()).thenReturn(false);
        when(client.search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse);

I get NullPointerException on SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); line in class that is being tested. Here is full test class with annotations and imports, I only skipped names of services used but they are not related and every each of them worked before, the problem started when i needed to change constructor and add rest client and mock it. every other service works.

import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.search.*;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.document.DocumentField;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.test.util.ReflectionTestUtils;

import java.io.IOException;
import java.time.Instant;
import java.util.*;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

class RulePreviewsCollectorServiceTest {

    private String comAlias = "com";
    private String comNAlias = "comN";

    RestHighLevelClient client = mock(RestHighLevelClient.class);

    RulePreviewsCollectorService collectorService = createRulePreviewsCollectorService(Service,
            Service, Service, Service, Service, client);

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
        when(merchSnapshot.getRulesSnapshot()).thenReturn(rulesSnapshot);
        client = mock(RestHighLevelClient.class);

        collectorService = new RulePreviewsCollectorService(Service, Service, Service,
                Service, Service, new Collector(),
                new Collector(), new Collector(), client);
        ReflectionTestUtils.setField(collectorService, "comAlias", "com");
        ReflectionTestUtils.setField(collectorService, "comNAlias", "comN");
    }

    @Test
    void testCollect() throws IOException {
       
       ActionsSearchRequest request = ActionsSearchRequest.builder()
                .merchSnapshot(merchSnapshot)
                .siteName(SiteName.COM)
                .searchPhrase("skirt")
                .build();
        SearchHit hit1 = new SearchHit(1);
        SearchHit hit2 = new SearchHit(2);

        SearchHits searchHits = new SearchHits(new SearchHit[]{hit1, hit2}, new TotalHits(2, TotalHits.Relation.EQUAL_TO), 1.0f);

        SearchResponse searchResponse = mock(SearchResponse.class);
        when(searchResponse.getHits()).thenReturn(searchHits);
        when(searchResponse.getTotalShards()).thenReturn(1);
        when(searchResponse.getSuccessfulShards()).thenReturn(1);
        when(searchResponse.getFailedShards()).thenReturn(0);
        when(searchResponse.getShardFailures()).thenReturn(null);
        when(searchResponse.isTimedOut()).thenReturn(false);
        when(client.search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse);
                     
    private RulePreviewsCollectorService createRulePreviewsCollectorService(Service Service,
                                                                            Service Service,
                                                                            Service Service,
                                                                            Service Service,
                                                                            Service Service,
                                                                            RestHighLevelClient client) {

        return new RulePreviewsCollectorService(Service, Service, Service, Service, Service, new Collector(), new Collector(), new Collector(), client);
    }
}


0

There are 0 best solutions below