Встроенные сообщения обновления Kafka между тестами
Я использую Spring Kafka с @EmbeddedKafka
аннотация для запуска экземпляра Embedded kafka.
Зависимость:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
И я настроил свое приложение для подключения к нему:
spring:
kafka:
bootstrap-servers: ${spring.embedded.kafka.brokers}
Я успешно отправляю сообщения и потребляю сообщения.
Моя проблема в том, что сообщения где-то сохраняются и могут появляться в последующих тестовых прогонах. И журналы печатают эти:
Successfully joined group with generation 117
Большое число поколений указывает, что Кафка между повторными тестами сохраняет информацию, которую я не хочу.
Как мне полностью очистить Embedded Kafka и начать все заново?
РЕДАКТИРОВАТЬ:
У меня была проблема с неправильным использованием Spring Profiles. У меня была собственная аннотация аннотации с моей встроенной конфигурацией Kafka. Проблема была в том, что я настраивал @ActiveProfiles("kafka")
в составной аннотации, а также настройке @ActiveProfiles("dev")
в реальном тестовом классе. Я обновил составную аннотацию к этому:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
// @ActiveProfiles("kafka") REMOVED
@TestPropertySource(properties = "spring.kafka.bootstrap-servers=${spring.embedded.kafka.brokers}")
@EmbeddedKafka(/* config properties */)
public @interface CustomEmbeddedKafka{
}
1 ответ
Вам нужно использовать @DirtiesContext
убрать контекст приложения между тестами. Вместе с этим встроенный брокер Kafka также будет уничтожен.
Если проблема заключается в методах одного тестового класса, то вам нужно переосмыслить логику, чтобы там не мешали одни и те же темы в разных методах.
Вы также можете рассмотреть возможность использования @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
, но это будет своего рода снижение производительности, так как контекст приложения вместе со встроенным Kafka будет воссоздан перед каждым методом тестирования.
ОБНОВИТЬ
Попробуйте это предложение вместо application.properties
модификация:
static {
System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY,
"spring.kafka.bootstrap-servers");
}
См. https://docs.spring.io/spring-kafka/docs/2.2.5.RELEASE/reference/