Выбор ответа Middle Тестирование в Spring обновлено

Ожидание асинхронного результата

Вопрос

Как правильно дождаться результата асинхронной обработки (например, сообщения из Kafka) в интеграционном тесте?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ждать условие с таймаутом через Awaitility. await().atMost(Duration.ofSeconds(10)).untilAsserted(...) проверяет условие с интервалом и завершается, как только оно выполнено: тест быстрый, когда всё хорошо, и не хрупкий на медленном CI.

Варианты ответа

  1. Thread.sleep(5000)
  2. Запускать тест несколько раз, пока не пройдёт
  3. Ждать условие с таймаутом через Awaitilityправильный ответ
  4. Сделать обработку синхронной в продакшен-коде

Разбор

await().atMost(Duration.ofSeconds(10)).untilAsserted(...) проверяет условие с интервалом и завершается, как только оно выполнено: тест быстрый, когда всё хорошо, и не хрупкий на медленном CI. Фиксированный sleep либо зря ждёт, либо слишком короткий. Перезапуски прячут проблему, а менять прод-код ради теста неправильно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.