Метод takeRequest() из MockWebServer требует много времени для ответа или зависает
Я использую библиотеку MockWebServer в своих тестах Android JUnit. Я тестирую SDK, который делает звонки на сервер. Так что я использую MockWebServer
переопределить эти URL-адреса сервера и записать то, что отправляет SDK, чтобы сделать на нем утверждения.
Проблема, с которой я сталкиваюсь, заключается в том, что если я пытаюсь сделать server.takeRequest()
и назначить его новому RecordedRequest
переменная, тест зависает на втором server.takeRequest()
а иногда даже на первом - если я запускаю его на эмуляторе, он висит на первом server.takeRequest()
метод, но если я запускаю его на моем физическом устройстве Android, он зависает на втором server.takeRequest()
метод.
public void testSomething() {
final MockWebServer server = new MockWebServer();
try {
server.play();
server.enqueue(new MockResponse().setBody("")
.setResponseCode(HttpURLConnection.HTTP_INTERNAL_ERROR));
server.enqueue(new MockResponse().setBody("")
.setResponseCode(HttpURLConnection.HTTP_OK));
server.enqueue(new MockResponse().setBody("")
.setResponseCode(HttpURLConnection.HTTP_OK));
URL url = server.getUrl("/");
// This internal method overrides some of the hardcoded URLs
// within the SDK that I'm testing.
Util.overrideUrls(url.toString())
// Do some server calls via the SDK utilizing the mock server url.
RecordedRequest requestFor500 = server.takeRequest();
// Do some assertions with 'requestFor500'
// Do some more server calls via the SDK utilizing the mock server url.
/*
* This is the part where the JUnit test hangs or seems to go into
* an infinite loop and never recovers
*/
RecordedRequest requestAfter500Before200 = server.takeRequest();
} catch {
...
}
}
Я делаю что-то не так или это какая-то ошибка с MockWebServer
?
1 ответ
Добавьте таймаут в MockWebServer, чтобы он не зависал server.takeRequest(1, TimeUnit.SECONDS);
Кажется, есть проблема с очередью отправки MockWebServer, которая по какой-то причине зависает при обслуживании ответов, не являющихся 200 или 302. Я решил эту проблему, предоставив специальный диспетчер:
MockWebServer server = ...;
final MockResponse response = new MockResponse().setResponseCode(401);
server.setDispatcher(new Dispatcher() {
@Override
public MockResponse dispatch(RecordedRequest request)
throws InterruptedException {
return response; // this could have been more sophisticated
}
});
Протестировано с MockWebServer 2.0.0