testcontainers-annotations/readme/KafkaTestcontainer.md
2021-08-01 02:17:38 +07:00

5.7 KiB
Raw Blame History

@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 для запуска спрингового контекста

Еще пример использования

image