Не моделируйте сеть с помощью 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()