MockWebServer的takeRequest()方法需要很长时间才能响应或挂起

时间:2013-09-11 20:34:57

标签: java android junit mocking mockwebserver

我在Android JUnit测试中使用MockWebServer库。我正在测试一个调用服务器的SDK。所以我使用MockWebServer覆盖这些服务器URL并捕获SDK发送的内容以对其进行断言。

我遇到的问题是,如果我尝试执行server.takeRequest()并将其分配给新的RecordedRequest变量,则测试将在第二个server.takeRequest()上挂起,有时会挂起,即使在第一个 - 如果我在模拟器上运行它,它会挂在第一个server.takeRequest()方法上,但是如果我在我的物理Android设备上运行它,它会在第二个server.takeRequest()方法上冻结。 / p>

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的某种类型的错误?

2 个答案:

答案 0 :(得分:1)

向MockWebServer添加超时,以便它不会挂起 server.takeRequest(1,TimeUnit.SECONDS);

答案 1 :(得分:0)

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进行测试