【问题标题】:MockWebServer's takeRequest() method takes long to response or hangsMockWebServer 的 takeRequest() 方法响应时间长或挂起
【发布时间】:2013-09-16 00:59:37
【问题描述】:

我在我的 Android JUnit 测试中使用 MockWebServer 库。我正在测试一个调用服务器的 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 我今天注意到了这一点 - 可惜没有答案!我只是在 MWS 2.0.0 中使用示例...
  • 我也可以通过 MWS2 注意到这一点。顺便说一句,如果您在响应中设置一个标头,它似乎可以正常工作。
  • 看到这个也有200或302以外的任何响应代码。添加了'mockwebserver'标签,也许这会引起广场人的注意......

标签: java android junit mocking mockwebserver


【解决方案1】:

为 MockWebServer 添加超时,使其不会挂起 server.takeRequest(1, TimeUnit.SECONDS);

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 2020-10-02
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多