Springify: Kernfunktion von EndlessConsumer über Spring-Kafka
[demos/kafka/training] / src / test / java / de / juplo / kafka / ApplicationTests.java
index 6f58180..cbf215e 100644 (file)
@@ -13,10 +13,12 @@ import org.apache.kafka.common.serialization.StringSerializer;
 import org.apache.kafka.common.utils.Bytes;
 import org.junit.jupiter.api.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration;
 import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
 import org.springframework.boot.test.context.TestConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Primary;
 import org.springframework.kafka.test.context.EmbeddedKafka;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@@ -24,7 +26,6 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
 import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -37,7 +38,12 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.*;
 
 
-@SpringJUnitConfig(initializers = ConfigDataApplicationContextInitializer.class)
+@SpringJUnitConfig(
+               initializers = ConfigDataApplicationContextInitializer.class,
+    classes = {
+                               EndlessConsumer.class,
+                               KafkaAutoConfiguration.class,
+                               ApplicationTests.Configuration.class })
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 @TestPropertySource(
                properties = {
@@ -57,16 +63,12 @@ class ApplicationTests
        @Autowired
        KafkaProducer<String, Bytes> kafkaProducer;
        @Autowired
-       KafkaConsumer<String, Long> kafkaConsumer;
-       @Autowired
        KafkaConsumer<Bytes, Bytes> offsetConsumer;
        @Autowired
        ApplicationProperties properties;
        @Autowired
-       ExecutorService executor;
+       RecordHandler recordHandler;
 
-       Consumer<ConsumerRecord<String, Long>> testHandler;
-       EndlessConsumer<String, Long> endlessConsumer;
        Map<TopicPartition, Long> oldOffsets;
        Map<TopicPartition, Long> newOffsets;
 
@@ -80,7 +82,7 @@ class ApplicationTests
                send100Messages(i ->  new Bytes(longSerializer.serialize(TOPIC, i)));
 
                Set<ConsumerRecord<String, Long>> received = new HashSet<>();
-               testHandler = record -> received.add(record);
+               recordHandler.testHandler = record -> received.add(record);
 
                await("100 records received")
                                .atMost(Duration.ofSeconds(30))
@@ -106,17 +108,8 @@ class ApplicationTests
 
                await("Consumer failed")
                                .atMost(Duration.ofSeconds(30))
-                               .until(() -> !endlessConsumer.running());
+                               .untilAsserted(() -> checkSeenOffsetsForProgress());
 
-               checkSeenOffsetsForProgress();
-               compareToCommitedOffsets(newOffsets);
-
-               endlessConsumer.start();
-               await("Consumer failed")
-                               .atMost(Duration.ofSeconds(30))
-                               .until(() -> !endlessConsumer.running());
-
-               checkSeenOffsetsForProgress();
                compareToCommitedOffsets(newOffsets);
        }
 
@@ -215,7 +208,7 @@ class ApplicationTests
        @BeforeEach
        public void init()
        {
-               testHandler = record -> {} ;
+               recordHandler.testHandler = (record) -> {};
 
                oldOffsets = new HashMap<>();
                newOffsets = new HashMap<>();
@@ -226,44 +219,40 @@ class ApplicationTests
                        newOffsets.put(tp, offset - 1);
                });
 
-               Consumer<ConsumerRecord<String, Long>> captureOffsetAndExecuteTestHandler =
+               recordHandler.captureOffsets =
                                record ->
-                               {
                                        newOffsets.put(
                                                        new TopicPartition(record.topic(), record.partition()),
                                                        record.offset());
-                                       testHandler.accept(record);
-                               };
-
-               endlessConsumer =
-                               new EndlessConsumer<>(
-                                               executor,
-                                               properties.getClientId(),
-                                               properties.getTopic(),
-                                               kafkaConsumer,
-                                               captureOffsetAndExecuteTestHandler);
-
-               endlessConsumer.start();
        }
 
-       @AfterEach
-       public void deinit()
+
+       public static class RecordHandler implements Consumer<ConsumerRecord<String, Long>>
        {
-               try
-               {
-                       endlessConsumer.stop();
-               }
-               catch (Exception e)
+               Consumer<ConsumerRecord<String, Long>> captureOffsets;
+               Consumer<ConsumerRecord<String, Long>> testHandler;
+
+
+               @Override
+               public void accept(ConsumerRecord<String, Long> record)
                {
-                       log.info("Exception while stopping the consumer: {}", e.toString());
+                       captureOffsets
+                                       .andThen(testHandler)
+                                       .accept(record);
                }
        }
 
-
        @TestConfiguration
        @Import(ApplicationConfiguration.class)
        public static class Configuration
        {
+               @Primary
+               @Bean
+               public Consumer<ConsumerRecord<String, Long>> testHandler()
+               {
+                       return new RecordHandler();
+               }
+
                @Bean
                KafkaProducer<String, Bytes> kafkaProducer(ApplicationProperties properties)
                {