Как контролировать ответ с Elasticsearch asyn c api - PullRequest
4 голосов
/ 26 февраля 2020

Как я могу контролировать IndexResponse при использовании Elasticsearch asyn c API W / HighLevelRestClient v7.5?

Может быть, мне нужно издеваться над Низкоуровневый REST-клиент и использовать этот макет для моего Высокоуровневого REST-клиента ? 101

@Test
void whenIndexResponseHasFailuresDoItShouldReturnFalse() {

  // arrange
  var indexResponse = mock(IndexResponse.class);
  when(indexResponse.getResult()).thenReturn(Result.UPDATED);

  var restHighLevelClient = mock(RestHighLevelClient.class);
  when(restHighLevelClient.indexAsync())
      //do something here??

  var indexReqest = new IndexRequest(...);

  //act
  var myHelper = new MyHelper(restHighLevelClient);
  var result = myHelper.doIt(indexReqest)
    .get();

  //assert
  assert(result).isFalse();
}
class MyHelper {

  //injected RestHighLevelClient

  CompletableFuture<Boolean> doIt(Customer customer) {

    var result = new CompletableFuture<Boolean>();
    var indexRequest = new IndexRequest(...);

    restHighLevelClient.indexAsync(indexRequest, RequestOptions.DEFAULT
         , new ActionListener<IndexResponse>() {
      @Override
      public void onResponse(IndexResponse indexResponse) {  //want to control indexResponse
        if (indexResponse.getResult() == Result.UPDATED) {
          result.complete(false);
        } else {
          result.complete(true);
        }
      }

      @Override
      public void onFailure(Exception e) {
        ...
      }
    });

    return result;
  }
}

Обновление Пример проекта с использованием ответа Олега

1 Ответ

1 голос
/ 26 февраля 2020

Mock RestHighLevelClient, затем внутри indexAsync mock IndexResponse и передайте его в ActionListener.

RestHighLevelClient restHighLevelClient = mock(RestHighLevelClient.class);
when(restHighLevelClient.indexAsync(any(), any(), any())).then(a -> {
    ActionListener<IndexResponse> listener = a.getArgument(2);
    IndexResponse response = mock(IndexResponse.class);
    when(response.getResult()).then(b -> {
        return Result.UPDATED;
    });
    listener.onResponse(response);
    return null;
});
MyHelper myHelper = new MyHelper(restHighLevelClient);
Boolean result = myHelper.doIt(null).get();
assertFalse(result);

Кроме того, настройте Mockito для поддержки финальных методов насмешки, в противном случае - NPE будет выброшено при насмешке indexAsync.

Опция 1

Вместо использования артефакта с ядром мокито, включите встроенный артефакт в вашем проекте

Опция 2

Создание файла src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker с mock-maker-inline как содержание

...