5.7 KiB
@KafkaTestcontainer
Аннотация подключает и запускает тестконтейнер KafkaContainer
+ настройки
контейнера будут проинициализированы в контекст тестового приложения
Аннотация требует дополнительной конфигурации (см. ниже)
Пример использования @KafkaTestcontainer
с KafkaProducer
— в magista
Пример использования @KafkaTestcontainer
с KafkaConsumer
— в sink-drinker
Параметры аннотации
String[] properties() default {};
properties()
аналогичный параметр как у аннотации SpringBootTest
, например — properties = {"kafka.topics.invoicing.consume.enabled=true",...}
String[] topicsKeys();
topicsKeys()
обязательный параметр — здесь перечисляются параметры, которые хранят в себе имена топиков, которые требуется создать при старте кафки, например — topicsKeys = {"kafka.topics.invoicing.id",...}
Создание топиков происходит через AdminClient
, также есть дополнительная валидация результатов создания топиков, без валидации приложение не запустится
@KafkaTestcontainerSingleton
Аннотация является @KafkaTestcontainer
в режиме синглтона — создаваемый тестконтейнер KafkaContainer
будет создан один раз (в разрезе всего набора тестовых классов в пакете test
) и будет переиспользоваться в каждом тестовом классе
Дополнительные обертки
@DefaultSpringBootTest
представляет из себя типичный для домена rbkmoney набор
аннотаций, используемых с SpringBootTest
при тестировании спринговых приложений
@KafkaSpringBootTest
аннотация, используемая с SpringBootTest
при тестировании спринговых приложений c кафкой
Init @ContextConfiguration
KafkaConsumerConfig
, KafkaProducerConfig
— кофиги для инциализации тестового консьюмера или продьюссера в зависимости от того, что проверяется в тесте
При использовании KafkaProducerConfig
в приложении можно использовать продьюссер для отправки данных в брокер
@Autowired
private KafkaProducer<TBase<?, ?>> testThriftKafkaProducer;
...
testThriftKafkaProducer.send(invoicingTopicName, sinkEvent);
...
Пример использования KafkaProducer
— в магисте
При использовании KafkaConsumerConfig
в приложении можно использовать консьюмер для получения данных из брокера
@Autowired
private KafkaConsumer<Event> testPayoutEventKafkaConsumer;
...
testPayoutEventKafkaConsumer.read(topicName, data -> readEvents.add(data.value()));
Unreliables.retryUntilTrue(TIMEOUT, TimeUnit.SECONDS, () -> readEvents.size() == expected);
...
Пример использования KafkaConsumer
— в sink-drinker
Примеры использования
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@KafkaTestcontainer(
properties = {
"kafka.topics.invoicing.consume.enabled=true",
"kafka.topics.invoice-template.consume.enabled=true",
"kafka.topics.pm-events-payout.consume.enabled=true",
"kafka.state.cache.size=0"},
topicsKeys = {
"kafka.topics.invoicing.id",
"kafka.topics.invoice-template.id",
"kafka.topics.pm-events-payout.id"})
public @interface ApplicationKafkaTestcontainer {
}
@KafkaTestcontainer
имплементируется с настройками кафки для приложения
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@PostgresqlTestcontainer
@ApplicationKafkaTestcontainer
@KafkaSpringBootTest
public @interface ApplicationSpringBootITest {
}
Создается обертка в виде аннотации, которая при использовании по очереди поднимает базу, кафку (нашу имплементированную
аннотацию) и SpringBootTest
для запуска спрингового контекста
Еще пример использования