All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dev.vality.testcontainers.annotations.kafka.KafkaTestcontainer Maven / Gradle / Ivy

package dev.vality.testcontainers.annotations.kafka;

import dev.vality.testcontainers.annotations.KafkaSpringBootTest;
import dev.vality.testcontainers.annotations.postgresql.PostgresqlTestcontainer;
import dev.vality.testcontainers.annotations.kafka.config.KafkaConsumer;
import dev.vality.testcontainers.annotations.kafka.config.KafkaProducer;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Аннотация {@code @KafkaTestcontainer} подключает и запускает тестконтейнер
 * {@link org.testcontainers.containers.KafkaContainer}, также
 * настройки контейнера будут проинициализированы в контекст тестового приложения
 * 

Аннотация требует дополнительной конфигурации {@link KafkaTestcontainer#topicsKeys()} *

Пример использования {@link KafkaTestcontainer} с {@link KafkaProducer} — в * magista *

Пример использования {@link KafkaTestcontainer} с {@link KafkaConsumer} — в * sink-drinker *

Примеры

*

В примере ниже создается обертка над аннотацией для конкретного приложения с инициализацией * конкретных топиков приложения. Эту обертку можно позже переиспользовать для любых тестов, * требующих внешний контейнер с кафкой в разрезе конкретного приложения *

 {@code
 * @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 CustomKafkaTestcontainer {
 * }}
*

В примере ниже {@link KafkaTestcontainer} подключается напрямую * к {@link PostgresqlTestcontainer} и {@link SpringBootTest} * для проведения теста консьюмера, который читает данные из топика *

 {@code
 * @PostgresqlTestcontainer
 * @KafkaTestcontainer(
 *         properties = "kafka.topic.pm-events-payout.produce.enabled=true",
 *         topicsKeys = "kafka.topic.pm-events-payout.name")
 * @SpringBootTest
 * public class KafkaSenderTest {
 *
 *     @Autowired
 *     private KafkaConsumer testPayoutEventKafkaConsumer;
 *
 *   ...
 * }}
*

В примере ниже {@link KafkaTestcontainer} подключается к * {@link PostgresqlTestcontainer} и {@link KafkaSpringBootTest}, * таким образом создается удобная обертка, которую можно использовать для набора тестов *

 {@code
 * @Target({ElementType.TYPE})
 * @Retention(RetentionPolicy.RUNTIME)
 * @PostgresqlTestcontainer
 * @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"})
 * @KafkaSpringBootTest
 * public @interface KafkaPostgresqlSpringBootITest {
 * }}
*
 {@code
 * @KafkaPostgresqlSpringBootITest
 * public class KafkaListenerTest {
 *
 *     @Autowired
 *     private KafkaProducer> testThriftKafkaProducer;
 *     ...
 * }}
* * @see KafkaTestcontainerSingleton @KafkaTestcontainerSingleton * @see ExtendWith @ExtendWith * @see KafkaTestcontainerExtension KafkaTestcontainerExtension * @see KafkaProducer KafkaProducer * @see KafkaConsumer KafkaConsumer * @see KafkaSpringBootTest @KafkaSpringBootTest */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(KafkaTestcontainerExtension.class) public @interface KafkaTestcontainer { /** * Аналогичный параметр как у аннотации {@link SpringBootTest#properties()} *

* пример — properties = {"kafka.topics.invoicing.consume.enabled=true",...} */ String[] properties() default {}; /** * Обязательный параметр — здесь перечисляются параметры, которые хранят в себе * имена топиков, которые требуется создать при старте кафки * Создание топиков происходит через {@link org.apache.kafka.clients.admin.AdminClient}, * также есть дополнительная валидация результатов создания топиков, * без валидации приложение не запустится *

* пример — topicsKeys = {"kafka.topics.invoicing.id",...} */ String[] topicsKeys(); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy