#spring #spring-boot #kotlin #spring-kafka #spring-kafka-test
#весна #весенняя загрузка #kotlin #spring-kafka #spring-kafka-test
Вопрос:
Я обновил библиотеки одного проекта, в частности, я обновил Spring Boot с версии 2.2.6 до 2.3.2.
Как упоминалось в документации по миграции, это также означало бы изменение моих зависимостей Kafka, переход к Spring Kafka и Kafka 2.5
Однако, после этого изменения, некоторые из моих тестов «случайным образом» завершаются неудачей, например, когда я выполняю все свои тесты, я сталкиваюсь с этим сбоем в некоторых из них (но не всегда в одних и тех же тестах):
java.lang.IllegalStateException: More than one record for topic found
Исходя из этой конкретной строки:
KafkaTestUtils.getSingleRecord(consumer, topicConfiguration.getTopic(event))
В документации нет упоминания о том, почему это происходит, и никакое другое сообщение об ошибке журнала, проливающее свет на то, почему это происходит. Поскольку я не изменил логику своего приложения, я что-то упустил при миграции?
Если я попробую что-то вроде этого:
KafkaTestUtils.getRecords(consumer)
.records(topicConfiguration.getTopic(event)).map { it }[0]
Чтобы получить только первый, тесты, которые работали ранее, завершились неудачей с IndexOutOfBoundsException
из-за индекса.
Ответ №1:
Согласно тестовой документации библиотеки Spring Kafka, начиная с версии 2.5, они изменили способ настройки потребителей. Это точная цитата:
Начиная с версии 2.5,
consumerProps
метод устанавливаетConsumerConfig.AUTO_OFFSET_RESET_CONFIG
значениеearliest
. Это потому, что в большинстве случаев вы хотите, чтобы потребитель использовал любые сообщения, отправленные в тестовом примере. ПоConsumerConfig
умолчанию установлено значениеlatest
, что означает, что сообщения, уже отправленные тестом до запуска потребителя, не будут получать эти записи. Чтобы вернуться к предыдущему поведению, установите для свойства значениеlatest
после вызова метода.
Это, скорее всего, может быть причиной описанных ошибок теста.
Комментарии:
1. Приятно! Я рад слышать, что ответ был полезным.