Модульное тестирование вызова дооснащения2 дает мне нулевое значение при издевательстве Call <Void> - PullRequest
0 голосов
/ 24 марта 2020

Я видел много разных способов, которыми люди тестировали свои модульные тесты на модернизацию2, и я чувствую, что это было самое близкое, что я получил. Я могу смоделировать свой интерфейс API, но когда дело доходит до насмешки над вызовом, вызов всегда возвращается null. Есть что-то, что я пропускаю или делаю неправильно?

Вот мой метод тестирования:

@Test
public void testApiSuccess() {
    TestRequestBody testRequestBody = Util.getTestBody();

    ApiService mockedApiService = Mockito.mock(ApiService.class);
    Call<Void> mockedCall = Mockito.any(Call.class);

    when(mRestClient.apiService()).thenReturn(mockedApiService);
    Mockito.when(mockedApiService.executeApi(testRequest)).thenReturn(mockedCall);

    Mockito.doAnswer(invocation -> {
        Callback<Void> callback = invocation.getArgumentAt(0, Callback.class);
        callback.onResponse(mockedCall, Response.success(null));
        return null;
    }).when(mockedCall).enqueue(any(Callback.class));

    presenter.executeApi();
    verify(view).showSuccess();
}

Блок кода, который я тестирую, выглядит следующим образом:

@Override
public void executeApi() {
    RequestBody requestBody = getRequestbody();

    Call<Void> call = mRestClient.apiService().executeApi(requestBody);
    call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(Call<Void> call, Response<Void> response) {
            if (response != null && response.code() == 200) {
                view.showSuccess();
            } else {
                view.showError();
            }
        }

        @Override
        public void onFailure(Call<Void> call, Throwable t) {
            view.showError();
        }
    });
}

Мой тест продолжается до call.enqueue и не проходит здесь, потому что call равен нулю. Что-то не так, когда я пытаюсь издеваться над call. Занимался здесь сейчас пол дня. Любые подсказки могут помочь.

1 Ответ

0 голосов
/ 24 марта 2020

Я подозреваю, что это потому, что тело запроса, которое вы ожидаете передать на executeApi() в макете, не совпадает с телом, которое передается на executeApi() в блоке кода, как, например, getRequestBody();! = Util.getTestBody(); так что ваш поддельный звонок никогда не возвращается.

Решением было бы сделать тело запроса параметром и на уровне докладчика; Таким образом, из вашего теста вы можете вызвать presenter.executeApi(testRequestBody);, который вызовет executeApi с ожидаемым параметром и вернет ваш смоделированный Call.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...