首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RestHighLevelClient JUnit测试返回NullPointerException

RestHighLevelClient JUnit测试返回NullPointerException
EN

Stack Overflow用户
提问于 2020-02-19 15:44:48
回答 1查看 1.1K关注 0票数 0

我目前正在研究如何测试我的实现RestHighLevelClient的ElasticSearch类的覆盖率。问题是它返回指向RestHighLevelClient.class的空指针。我是ES的新手,我不知道我哪里错了。

下面是我的ElasticSearch类:

代码语言:javascript
复制
@Service
public class ElasticsearchService {

    @Autowired
    private LoggingService loggingService;

    @Autowired
    private LocationService locationService;

    @Autowired
    private RestHighLevelClient client;

    @Autowired
    private ObjectMapper mapper;

    @Autowired
    private Utils util;

    @Autowired
    private ApplicationProperties prop;

    public String addAtmStatusRecord(ATM atm) throws IOException {
        GeoPoint geoPoint = locationService.getLocation(atm.getTerminalId());

        XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject()
            .field("terminalId", atm.getTerminalId())
            .field("atmStatus", "D".equals(atm.getAtmStatus()) ? 1 : 0)
            .field("atmLocation", atm.getAtmLocation())
            .field("errorDescription", atm.getErrorDescription())
            .field("lastTranTime", atm.getLastTranTime())
            .field("lastDevStatTime", atm.getLastDevStatTime())
            .field("errorCode", atm.getErrorCode())
            .field("termBrcode", atm.getTermBrcode())
            .timeField("@timestamp", new Date())
            .latlon("location", geoPoint.getLat(), geoPoint.getLon())
            .endObject();

        IndexRequest indexRequest = new IndexRequest(prop.getEsIndex(), prop.getEsType(), atm.getTerminalId()).source(builder);
        IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
        loggingService.log(this.getClass().toString(), atm.getTerminalId(), TraceLog.SUCCESSFUL_PUSH_TO_ELASTIC_SEARCH, 
                util.mapToJsonString(atm));

        return response.getResult().name();
    }



    public List<AtmElasticSearchData> searchForOfflineAtmData() throws IOException {
        SearchResponse searchResponse = getAllOfflineAtmData();
        List<SearchHit> searchHits = Arrays.asList(searchResponse.getHits().getHits());
        List<AtmElasticSearchData> listOfAtm = new ArrayList<>();

        for (SearchHit searchHit : searchHits) {
            listOfAtm.add(mapper.readValue(searchHit.getSourceAsString(), AtmElasticSearchData.class));
        }

        return listOfAtm;
    }

    public SearchResponse getAllOfflineAtmData() throws IOException {
        Map<String, Object> queryParam = new HashMap<>();   
        queryParam.put("atmStatus", 1);
        return retrieveElasticSearchData(queryParam);
    }

    public long getAllOfflineAtmCount() throws IOException {
        return getAllOfflineAtmData().getHits().getTotalHits();
    }

    private SearchResponse retrieveElasticSearchData(Map<String, Object> queryParams) throws IOException {
        SearchSourceBuilder searchSourceBuilder  = new SearchSourceBuilder();

        queryParams.entrySet().forEach(queryParam -> searchSourceBuilder.query(
                QueryBuilders.termQuery(queryParam.getKey(), queryParam.getValue())));
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(Integer.parseInt(prop.getEsMaxSearchSize()));
        SearchRequest searchRequest = new SearchRequest(prop.getEsIndex())
                .types(prop.getEsType())
                .source(searchSourceBuilder);

        return client.search(searchRequest, RequestOptions.DEFAULT);
    }
}

下面是我的测试用例:

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ATMMonitoringApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
public class ElasticsearchServiceTest {

    @Autowired
    private ElasticsearchService elasticsearchService;

    @MockBean
    private LoggingService loggingService;

    @MockBean
    private LocationService locationService;

    @MockBean
    private RestHighLevelClient client;

    @MockBean
    private ObjectMapper mapper;

    @MockBean
    private Utils util;

    @MockBean
    private IndexRequest indexRequest;
    @MockBean IndexResponse indexResponse;

    @Value("${elastic.search.atm.monitoring.index}")
    private String esIndex;

    @Value("${elastic.search.atm.monitoring.type}")
    private String esType;

    private ATM atm;

    @Before
    public void setUp() throws ParseException, IOException {

        client = mock(RestHighLevelClient.class);
        indexRequest = mock(IndexRequest.class);
        indexResponse = mock(IndexResponse.class);

        MockitoAnnotations.initMocks(this);
        atm = new ATM();
        atm.setAtmLocation("location");
        atm.setAtmStatus("U");
        atm.setErrorCode("222");
        atm.setErrorDescription("STATUS");
        atm.setLastDevStatTime(null);
        atm.setLastTranTime(null);
        atm.setTerminalId("123");
        atm.setTermBrcode("111");

    }

    @Test
    public void testAddAtmStatusRecordIsNull() throws IOException, NumberFormatException, IllegalArgumentException, IllegalAccessException {

        Mockito.when(locationService.getLocation(Mockito.anyString())).thenReturn(new GeoPoint(121.00000, 11.9874));
        elasticsearchService.addAtmStatusRecord(atm);
        assertThat(1).isEqualTo(1);
    }
        @Test
    public void testAddAtmStatusRecordAtmIsDown() throws IOException {
        ATM atm = new ATM();
        atm.setAtmStatus("D");
        Mockito.when(locationService.getLocation(Mockito.anyString())).thenReturn(new GeoPoint(121.00000, 11.9874));
        elasticsearchService.addAtmStatusRecord(atm);
        assertThat(1).isEqualTo(1);
    }

    @Test
    public void testGetAllOfflineAtmCount() throws IOException {

        elasticsearchService.getAllOfflineAtmCount();
        assertThat(1).isEqualTo(1);

    }

    @Test
    public void testsearchForOfflineAtmData() throws IOException {

        List<AtmElasticSearchData> atmEsData = new ArrayList<>();
            elasticsearchService.searchForOfflineAtmData();

        assertThat(1).isEqualTo(1);
    }


}

我的端口已经在我的app.properties中设置为9200。

请在这方面给我一些帮助。我真的需要解决这个问题。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-09-03 07:52:02

RestHighLevelClient中的大多数方法都是最终的,所以不能被模仿并调用实际的方法和抛出空指针。请参阅此帖子NullPointerException Problem when trying to mock Elastic Search's RestHighLevelClient

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60295297

复制
相关文章

相似问题

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