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

How to assign responses in MockWebServer to expected requests?

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

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);

这可能吗?

来自他们的documentation

By default MockWebServer uses a queue to specify a series of responses. Use a Dispatcher to handle requests using another policy. One natural policy is to dispatch on the request path. You can, for example, filter the request instead of using 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 语句,但您可以在此处更改它并实现您的自定义逻辑。