Fil*_*ero 9 java junit android mocking mockwebserver
我在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 {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么或是这种类型的错误MockWebServer?
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
}
});
Run Code Online (Sandbox Code Playgroud)
使用 MockWebServer 2.0.0 进行测试