Имитация отсутствия сети с помощью Retrofit и MockWebServer

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

В настоящее время я тестирую с использованием Espresso и предоставляю URL-адрес MockWebServers для RestAdapter, прежде чем начать свои тесты. Это отлично работает для имитации ответов сервера и т. Д., Но я не вижу простого способа написать сценарий исключения java.net.ConnectException, возникающего, когда на устройстве нет сети. Я вижу, что MockResponse позволяет регулировать симуляцию и т. Д., Но не пользовательское исключение.

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

Думаю, я просто пропустил что-то простое :)

Спасибо


person Dori    schedule 25.07.2014    source источник


Ответы (5)


В 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 для мгновенных результатов.

person Jake Wharton    schedule 25.07.2014
comment
Ссылка битая :( - person Alireza Farahani; 11.11.2015
comment
Обновленная ссылка: github .com/square/retrofit/blob/master/retrofit-mock/src/test/ - person ; 09.01.2016
comment
Сэр, я пытаюсь переопределить базовый URL-адрес модификации на адрес mockwebserver, но затем я все равно делаю вызов веб-службы при выполнении теста, есть ли способ остановить это? Пожалуйста помогите. @tony19, Джейк Уортон - person Rat-a-tat-a-tat Ratatouille; 26.03.2016

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

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

Таким образом, вы можете получить два типа:

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

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

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

На самом деле я не знаю, как ваш код, но я надеюсь, что это полезно

person mromer    schedule 25.07.2014
comment
+1 спасибо за ответ, но на самом деле это не отвечает на вопрос, так как я хочу имитировать отсутствие сети, а не тайм-аут. Диспетчеры интересные однако. Интересно, могу ли я бросить вышеуказанные исключения, хотя это... - person Dori; 25.07.2014
comment
кажется, я не могу, так как сетевые исключения проверяются, а диспетчер выдает только Inturrupted в соответствии с его интерфейсом - person Dori; 25.07.2014

Самый простой способ смоделировать проблемы с сетью с помощью MockWebServer — установить для SocketPolicy значение SocketPolicy.DISCONNECT_AT_START, SocketPolicy.NO_RESPONSE или т. д.:

MockWebServer server = new MockWebServer();

MockResponse response = new MockResponse()
  .setSocketPolicy(SocketPolicy.DISCONNECT_AT_START);

server.enqueue(response);

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

person Konstantin Grech    schedule 02.04.2020

Я не знаю, полезно ли это, но вы можете смоделировать тайм-аут с помощью 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) с этим номером порта для целей тестирования.

person Jesús Castro    schedule 18.02.2015

Что сработало для меня, так это указание URL-адреса модификации (конечной точки) на случайный несуществующий хост. Я использовал «thisIsARandomHost.com», и мне удалось смоделировать исключение неизвестного хоста.

Например: setAPP_URL = "http://thisIsARandomHost.com/";

Здесь setAPP_URL - это строковая переменная, содержащая мой URL-адрес, который я передаю для модификации, когда я хочу смоделировать исключение неизвестного хоста в своих тестах, я устанавливаю URL-адрес, как указано выше. Для всех других целей он устанавливается на действительный URL-адрес, требуемый моим приложение.

Как указано в приведенных выше ответах, MockWebServer - отличная библиотека для имитации ответов на модифицирование, но вам не нужна эта библиотека для имитации этого исключения. Для имитации всех других исключений я бы рекомендовал MockWebServer , я часто использую его в своем проекте для тестирования ответов.

Примечание. Вы можете указать любой URL-адрес приложения, если такой URL-адрес не существует в Интернете.

person Pawan Chauhan    schedule 30.05.2019