Можете ли вы поставить ответы в очередь в диспетчере MockWebServer?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Можете ли вы поставить ответы в очередь в диспетчере MockWebServer?

Сообщение Anonymous »

Я пишу тесты для своего веб-сервера и использую MockWebServer (

Код: Выделить всё

okhttp3.mockwebserver
), чтобы высмеять ответы. Насколько я понимаю из документации, существует два способа сделать это:
  • Поставить в очередь все ответы по порядку (

    Код: Выделить всё

    mockWebServer.enqueue(...)
    )
  • Определите диспетчер, который определяет ответы на основе какой-либо другой политики (например, отправка по пути запроса
Я оказался в ситуации, когда мне нужно использовать оба этих подхода.
Диспетчер гораздо более эффективен, чем постановка в очередь каждого запроса для каждого теста, но его нельзя использовать для тестирования механизма повторных попыток. (например, Retry.backoff(3, Duration.ofSeconds(10)))). Ставить запросы в очередь легко, но утомительно для любого другого теста, не требующего повторной попытки.
На данный момент единственное решение, которое я могу придумать, — это использовать два отдельных MockWebServer для два типа тестов (один использует постановку в очередь для тестов на основе повторов, другой использует диспетчер для остальных тестов API). Это кажется неоптимальным, особенно потому, что диспетчер init() выполняется перед каждым тестом (

Код: Выделить всё

@BeforeAll
), поэтому повторные тесты будут иметь 2 MockWebServer одновременно.
Есть ли способ объединить оба этих подхода в один? В основном я ищу что-то вроде:

Код: Выделить всё

@Override
public MockResponse dispatch(RecordedRequest req) throws InterruptedException {
return switch (req.getPath()) {
case "/query1" -> new MockResponse().setResponseCode(200).setBody(...);
case "/query2" -> new MockResponse().setResponseCode(200).setBody(...);
case "/query3" -> server.enqueue(new MockResponse().setResponseCode(502));
server.enqueue(new MockResponse().setResponseCode(502));
server.enqueue(new MockResponse().setResponseCode(200).setBody(...));

В этом примере я хочу, чтобы запросы к /query1 и /query2 всегда возвращали указанные ответы, но для /query3 я хочу, чтобы они 3 конкретных ответа в таком порядке.
Но это, очевидно, не работает, поскольку методу Dispatcher Dispatcher(...) требуется одно возвращаемое значение MockResponse.
Я также ограничен использованием библиотек, уже имеющихся в проект, поэтому ответ на этот аналогичный вопрос мне не помог (к тому же эта библиотека не обновлялась более 5 лет).

Подробнее здесь: https://stackoverflow.com/questions/793 ... kwebserver
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»