11

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

MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse()...);
server.enqueue(new MockResponse()...);
server.enqueue(new MockResponse()...);

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

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

像伪代码:

server.enqueue(new MockResponse()).forExpectedRequest(req1);
server.enqueue(new MockResponse()).forExpectedRequest(req2);
server.enqueue(new MockResponse()).forExpectedRequest(req3);

那可能吗?

4

1 回答 1

15

从他们的文档

默认情况下,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);

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

于 2019-08-15T14:48:52.020 回答