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

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

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

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

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

Спасибо

6 ответов

Решение

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

Самый простой способ имитировать сетевые проблемы с помощью 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);

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

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

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

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

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

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

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

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

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

Для меня сработало указание URL-адреса Retrofit (конечная точка) на случайный несуществующий хост. Я использовал "thisIsARandomHost.com" и, бинго, смог смоделировать исключение неизвестного хоста.

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

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

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

Примечание. Вы можете установить URL-адрес приложения, если его нет в Интернете.

mockWebServer.shutdown() перед выполнением вашего модульного теста в порядке.

Внутренне он закрывает соединение сокета:

      serverSocket!!.close()
Другие вопросы по тегам