Тестирование поведения приложения в зависимости от получения JSON от Retrofit, переопределение ответа на обратный вызов - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь протестировать приложение, которое я разрабатываю для клиента.Поскольку они работают в области медицины, у них много протоколов.Поэтому я не смогу изменить способ разработки тестов, даже если существует лучшее решение.

Мне нужно написать тест, который проверяет другое поведение приложения в зависимости от содержимого JSON, котороемы получаем с веб-сервера.Для тестов я хочу смоделировать этот ответ.

Поток следующий:

  1. Мы вызываем метод в презентаторе (fetchConfig)
  2. Эти методывызовите другой метод в модели (тоже fetchConfig), где в параметрах передается обратный вызов, и обработайте ответ модифицированного API (onResponse).

Где проблема заключается в том, как организован кодВот метод в презентаторе, который мы должны проверить:

    public void fetchConfig() {
    model.fetchConfig(new Callback<Config>() {
        @Override
        public void onResponse(@NonNull Call<Config> call, @NonNull Response<Config> response) {
            Config config = response.body();
            model.saveConfig(config);

            handleConfig(config);
        }

        @Override
        public void onFailure(@NonNull Call<Config> call, @NonNull Throwable t) {
            Config config = model.getConfig();

            handleConfig(config);
        }
    });
}

Что я хочу сделать, это отправить другой файл response.body в зависимости от требований теста.

Я пробовал много разных методов (doAnswer, when (). ThenAnswer (), ...), но ни один из них не работает правильно.

Вот метод в интерфейсе, который мне нуженВозврат другого вызова в зависимости от теста:

@GET("config")
Call<Config> getConfig(@Query("serialNumber") String serialNumber);

Все веб-вызовы выполняются с помощью Retrofit2 и OKHttp.Тесты выполняются с использованием Robolectric и Mockito.

Вот самое дальнейшее, что я сделал в реализации:

Callback<ch.intento.pro.model.Config> mockedCallback = mock(Callback.class);
    Call<ch.intento.pro.model.Config> mockedCall = mock(Call.class);

    doAnswer(new Answer() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            Gson gson = new Gson();
            ch.intento.pro.model.Config config =
                    gson.fromJson(mockServerResponse(
                            "config_200_ok_response_remote_disabled.json"),
                            ch.intento.pro.model.Config.class);

            System.out.print("Config object: " + config.getLicenceValidUntil() +  " " + config.isLicenceValid());

            mockedCallback.onResponse(mockedCall, Response.success(config));
            model.fetchConfig(mockedCallback);

            return null;
        }
    }).when(presenter).fetchConfig();

    presenter.fetchConfig();
    verify(view).showInvalidLicence();

Заранее благодарим за помощь;Я надеюсь, что предоставил достаточно деталей.

...