Я пытаюсь протестировать приложение, которое я разрабатываю для клиента.Поскольку они работают в области медицины, у них много протоколов.Поэтому я не смогу изменить способ разработки тестов, даже если существует лучшее решение.
Мне нужно написать тест, который проверяет другое поведение приложения в зависимости от содержимого JSON, котороемы получаем с веб-сервера.Для тестов я хочу смоделировать этот ответ.
Поток следующий:
- Мы вызываем метод в презентаторе (fetchConfig)
- Эти методывызовите другой метод в модели (тоже 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();
Заранее благодарим за помощь;Я надеюсь, что предоставил достаточно деталей.