Метод 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

Другие вопросы по тегам