如何将 MockWebServer 中的响应分配给预期的请求?

mem*_*und 6 java mockwebserver okhttp3

我想创建一个集成测试并模拟一个远程网络服务,如下所示:

MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse()...);
server.enqueue(new MockResponse()...);
server.enqueue(new MockResponse()...);
Run Code Online (Sandbox Code Playgroud)

问题:我有一个案例,其中 3 个请求并行发送到远程。因此,顺序总是随机的。

问题:如何告诉 MockWebServer 为预期的请求分配响应?

像伪代码:

server.enqueue(new MockResponse()).forExpectedRequest(req1);
server.enqueue(new MockResponse()).forExpectedRequest(req2);
server.enqueue(new MockResponse()).forExpectedRequest(req3);
Run Code Online (Sandbox Code Playgroud)

那可能吗?

Sne*_*neh 11

从他们的文档

默认情况下 MockWebServer 使用队列来指定一系列响应。使用 Dispatcher 处理使用另一个策略的请求。一种自然策略是在请求路径上调度。例如,您可以过滤请求而不是使用 server.enqueue()

您可以做的是在下面的代码中进行更改。

final Dispatcher dispatcher = new Dispatcher() {

    @Override
    public MockResponse dispatch (RecordedRequest request) throws InterruptedException {

        switch (request.getPath()) {
            case "/v1/login/auth/":
                return new MockResponse().setResponseCode(200);
            case "v1/check/version/":
                return new MockResponse().setResponseCode(200).setBody("version=9");
            case "/v1/profile/info":
                return new MockResponse().setResponseCode(200).setBody("{\\\"info\\\":{\\\"name\":\"Lucas Albuquerque\",\"age\":\"21\",\"gender\":\"male\"}}");
        }
        return new MockResponse().setResponseCode(404);
    }
};
server.setDispatcher(dispatcher);
Run Code Online (Sandbox Code Playgroud)

他们在路径上使用 switch 语句,但您可以更改它并在此处实现您的自定义逻辑。