Не моделируйте сеть с помощью Retrofit и MockWebServer
Я хочу симулировать случай отсутствия сети при использовании RetroFit
и MockWebServer
.
Im в настоящее время тестирует с помощью Espresso
и передает URL MockWebServer
в RestAdapter
, прежде чем начинать тесты. Это отлично подходит для насмешливых ответов сервера и т.д., Но я не вижу простой способ script исключения java.net.ConnectException
, возникшего, когда устройство не имеет сети. Я вижу, что MockResponse позволяет моделировать дросселирование и т.д., Но не обычное исключение.
Я знаю, что мог бы исправить насмехающийся фактический интерфейс web api, используемый RetroFit
, но я хотел бы использовать тот же подход, что и другие мои тесты, если это возможно, используя MockWebServer
.
Я предполагаю, что я просто пропустил что-то простое:)
Спасибо
Ответы
Ответ 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) с этим номером порта для целей тестирования.