Подтвердить что ты не робот

Не моделируйте сеть с помощью Retrofit и MockWebServer

Я хочу симулировать случай отсутствия сети при использовании RetroFit и MockWebServer.

Im в настоящее время тестирует с помощью Espresso и передает URL MockWebServer в RestAdapter, прежде чем начинать тесты. Это отлично подходит для насмешливых ответов сервера и т.д., Но я не вижу простой способ script исключения java.net.ConnectException, возникшего, когда устройство не имеет сети. Я вижу, что MockResponse позволяет моделировать дросселирование и т.д., Но не обычное исключение.

Я знаю, что мог бы исправить насмехающийся фактический интерфейс web api, используемый RetroFit, но я хотел бы использовать тот же подход, что и другие мои тесты, если это возможно, используя MockWebServer.

Я предполагаю, что я просто пропустил что-то простое:)

Спасибо

4b9b3361

Ответ 1

Retrofit имеет модуль retrofit-mock, который предлагает класс MockRestAdapter, целью которого является имитация задержек сети и ошибок.

Это используется вместе с обычным RestAdapter для создания экземпляра вашей службы. Вы можете увидеть полный пример в папке samples/mock-github-client/ репо: https://github.com/square/retrofit/tree/parent-1.9.0/retrofit-samples/mock-github-client

MockRestAdapter предлагает следующие API:

  • setDelay - установить задержку в сети в оба конца в миллисекундах.
  • setVariancePercentage - установите процент плюс-минус отклонения от задержки в сети в оба конца.
  • setErrorPercentage - Установите процент вызовов на calculateIsFailure(), которые возвращают true.

В своем тесте вы можете вызвать setErrorPercentage(100), чтобы гарантировать, что произойдет сетевая ошибка. По умолчанию время для ошибки, которую нужно выбросить, составляет от 0 до 3 раз задержка. Установите задержку на 0 для мгновенных результатов.

Ответ 2

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

Ошибка подключения к Интернету

Итак, вы можете получить два типа:

UnknownHostException. Если у вас нет интернета или неизвестного хоста... чтобы имитировать это, установите для адаптера неправильную конечную точку.

ConnectException - mockwebserver может вызывать исключение тайм-аута. Вы можете посмотреть, как это сделать здесь:

https://github.com/square/okhttp/tree/master/mockwebserver

Действительно, я не знаю, как ваш код, но я надеюсь, что это полезно

Ответ 3

Я не знаю, полезно ли это, но вы можете имитировать тайм-аут с помощью MockWebServer:

String contentType = "Content-type: application/json";
MockResponse response = MockResponse().setResponseCode(statusCode).setBody(responseBody).addHeader(contentType);
MockWebServer proxy = new MockWebServer();
proxy.enqueue(response);
proxy.setBodyDelayTimeMs(timeoutDelay));
proxy.play(10000); //Number port - Important!!!

Примечание. Пожалуйста, установите HttpClient вашего кода (например, AsyncHttpClient) с этим номером порта для целей тестирования.