Mockito, когда любое исключение java.lang.NullPointerException

У меня есть этот метод, который нужно протестировать:

    private void processRequest() {
        BulkRequest request = new BulkRequest();
        request.add(new IndexRequest("posts").id("1")
                .source(XContentType.JSON,"field", "foo"));
        request.add(new IndexRequest("posts").id("2")
                .source(XContentType.JSON,"field", "bar"));
        final BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    }

Вот что я пытаюсь сделать в своем тестовом классе:

    RestHighLevelClient restHighLevelClientMock = mock(RestHighLevelClient.class);

    final String errorMessage = "error message";
    final Exception cause = new Exception("test exception");
    final boolean isFailed = true;
    final int itemID = 0;
    // define the item failure
    BulkItemResponse.Failure failure = mock(BulkItemResponse.Failure.class);
    when(failure.getCause()).thenReturn(cause);
    when(failure.getMessage()).thenReturn(errorMessage);
    // define the item level response
    BulkItemResponse itemResponse = mock(BulkItemResponse.class);
    when(itemResponse.isFailed()).thenReturn(isFailed);
    when(itemResponse.getItemId()).thenReturn(itemID);
    when(itemResponse.getFailure()).thenReturn(failure);
    when(itemResponse.getFailureMessage()).thenReturn("error message");
    List<BulkItemResponse> itemsResponses = Collections.singletonList(itemResponse);
    // define the bulk response to indicate failure
    BulkResponse response = mock(BulkResponse.class);
    when(response.iterator()).thenReturn(itemsResponses.iterator());
    when(response.hasFailures()).thenReturn(isFailed);
    // have the client return the mock response
    when(restHighLevelClientMock.bulk(any(BulkRequest.class), RequestOptions.DEFAULT)).thenReturn(response);

Я получаю исключение java.lang.NullPointerException в этой строке:

when(restHighLevelClientMock.bulk(any(BulkRequest.class), RequestOptions.DEFAULT)).thenReturn(response);

Есть идеи, почему это происходит? Спасибо

1 ответ

Я тоже столкнулся с этой проблемой, что привело меня к этому запросу github:

https://github.com/elastic/elasticsearch/issues/40534

Класс RestHighLevelClient Elasticsearc пометил многие общедоступные методы как окончательные, что сделало невозможным имитацию.

На странице github есть обходной путь по созданию делегата, который не идеален, но работает.

РЕДАКТИРОВАТЬ: после поиска возможных решений я нашел эту статью: см. https://www.baeldung.com/mockito-final. Я попробовал это в своем собственном проекте и получил свои тесты, работающие с junit jupiter.

Добавьте в папку src / test / resources следующее:

mockito-extensions/org.mockito.plugins.MockMaker

добавьте следующую строку в файл org.mockito.plugins.MockMaker:

mock-maker-inline
Другие вопросы по тегам