Как назначить ответы в MockWebServer на ожидаемые запросы?

Я хочу создать интеграционный тест и смоделировать удаленный веб-сервис следующим образом:

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

Это возможно?


person membersound    schedule 15.08.2019    source источник


Ответы (1)


Из их документации

По умолчанию 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 в пути, но вы можете изменить его и реализовать свою собственную логику здесь.

person Sneh    schedule 15.08.2019
comment
Документация действительно помогла. Спасибо :) - person Spartan; 08.04.2021