Я пытаюсь настроить интеграционные тесты для обмена сообщениями Kafka и переключиться с использования Embedded-Kafka на Testcontainers. Учитывая следующую конфигурацию для docker-compose и базовый класс для всех интеграционных тестов:
kafka-compose.yaml:
@SpringBootTest
@Slf4j
public class IntegrationTest {
private static final DockerComposeContainer kafkaContainer = initializeKafkaContainer();
protected static DockerComposeContainer initializeKafkaContainer() {
log.info(
"Initializing kafka container. Should be called only once. Current value of the kafkaContainer: {}",
kafkaContainer);
try {
var kafkaContainer =
new DockerComposeContainer(new File("src/test/resources/kafka-compose.yml"))
.withExposedService("kafka_1", 9092);
kafkaContainer.start();
var bootstrapServers =
format(
"PLAINTEXT://%s:%s",
kafkaContainer.getServiceHost("kafka_1", 9092),
kafkaContainer.getServicePort("kafka_1", 9092));
System.setProperty("spring.embedded.kafka.brokers", bootstrapServers);
return kafkaContainer;
} catch (Throwable t) {
log.error("Can't initialize the Kafka test container.", t);
throw t;
}
}
Кажется, что Spring-kafka и это @KafkaListeners активны во всех возможных тестах, помеченных @SpringBootTest, а не только во время конкретных тестов Kafka. Это означает, что сообщение, отправленное в тему Kafka, может быть использовано произвольным тестом. Прежде всего вопрос к ребятам из Spring-Kafka: можно ли вообще использовать Spring-kafka-test вместе с Testcontainers? Есть ли какая-то возможность остановить все @KafkaListener для каждого теста и явно включить их для определенных тестов @SpringBootTest?
Testcontainers поставляется с модулем Kafka на борту. Здесь используется слитный образ докера Kafka, который очень упрям в настройке. Например, вы не можете установить некоторые свойства брокера и не можете указать контейнеру, какую тему следует создать после запуска. После борьбы с этим модулем я решил использовать модуль docker-compose с образом wurstmeister/kafka. Проблема с последним подходом заключается в том, что когда я запускаю тесты с помощью maven из командной строки, я получаю сообщение об ошибке, сообщающее, что kafka уже работает на порту 9092. Кажется, что maven запускает несколько JVM во время теста mvn, и, как следствие, статическое поле kafkaContainer инициализируется несколько раз. Почему это происходит?
Я пытаюсь настроить интеграционные тесты для обмена сообщениями Kafka и переключиться с использования Embedded-Kafka на Testcontainers. Учитывая следующую конфигурацию для docker-compose и базовый класс для всех интеграционных тестов: kafka-compose.yaml: [code]version: '3.3'
protected static DockerComposeContainer initializeKafkaContainer() { log.info( "Initializing kafka container. Should be called only once. Current value of the kafkaContainer: {}", kafkaContainer); try { var kafkaContainer = new DockerComposeContainer(new File("src/test/resources/kafka-compose.yml")) .withExposedService("kafka_1", 9092); kafkaContainer.start();
var bootstrapServers = format( "PLAINTEXT://%s:%s", kafkaContainer.getServiceHost("kafka_1", 9092), kafkaContainer.getServicePort("kafka_1", 9092));
@Test void shouldPerformSomething() { ... } [/code] Я столкнулся с несколькими проблемами: [list] [*]Кажется, что Spring-kafka и это @KafkaListeners активны во всех возможных тестах, помеченных @SpringBootTest, а не только во время конкретных тестов Kafka. Это означает, что сообщение, отправленное в тему Kafka, может быть использовано произвольным тестом. Прежде всего вопрос к ребятам из Spring-Kafka: можно ли вообще использовать Spring-kafka-test вместе с Testcontainers? Есть ли какая-то возможность остановить все @KafkaListener для каждого теста и явно включить их для определенных тестов @SpringBootTest? [*]Testcontainers поставляется с модулем Kafka на борту. Здесь используется слитный образ докера Kafka, который очень упрям в настройке. Например, вы не можете установить некоторые свойства брокера и не можете указать контейнеру, какую тему следует создать после запуска. После борьбы с этим модулем я решил использовать модуль docker-compose с образом wurstmeister/kafka. Проблема с последним подходом заключается в том, что когда я запускаю тесты с помощью maven из командной строки, я получаю сообщение об ошибке, сообщающее, что kafka уже работает на порту 9092. Кажется, что maven запускает несколько JVM во время теста mvn, и, как следствие, статическое поле kafkaContainer инициализируется несколько раз. Почему это происходит? [/list]