Springify: GRÜN - `start()`/`stop()` werden im Test explizit aufgerufen
[demos/kafka/training] / src / test / java / de / juplo / kafka / ApplicationTests.java
index e35b223..35d2b2e 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,14 @@ class ApplicationTests
        @Autowired
        KafkaProducer<String, Bytes> kafkaProducer;
        @Autowired
-       KafkaConsumer<String, Long> kafkaConsumer;
-       @Autowired
        KafkaConsumer<Bytes, Bytes> offsetConsumer;
        @Autowired
        ApplicationProperties properties;
        @Autowired
-       ExecutorService executor;
+       EndlessConsumer endlessConsumer;
+       @Autowired
+       RecordHandler recordHandler;
 
-       Consumer<ConsumerRecord<String, Long>> testHandler;
-       EndlessConsumer<String, Long> endlessConsumer;
        Map<TopicPartition, Long> oldOffsets;
        Map<TopicPartition, Long> newOffsets;
 
@@ -80,7 +84,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))
@@ -97,7 +101,7 @@ class ApplicationTests
 
        @Test
        @Order(2)
-       void commitsNoOffsetsOnError()
+       void commitsOffsetOfErrorForReprocessingOnError()
        {
                send100Messages(counter ->
                                counter == 77
@@ -106,10 +110,9 @@ class ApplicationTests
 
                await("Consumer failed")
                                .atMost(Duration.ofSeconds(30))
-                               .until(() -> !endlessConsumer.running());
+                               .untilAsserted(() -> checkSeenOffsetsForProgress());
 
-               checkSeenOffsetsForProgress();
-               compareToCommitedOffsets(oldOffsets);
+               compareToCommitedOffsets(newOffsets);
        }
 
 
@@ -207,7 +210,7 @@ class ApplicationTests
        @BeforeEach
        public void init()
        {
-               testHandler = record -> {} ;
+               recordHandler.testHandler = (record) -> {};
 
                oldOffsets = new HashMap<>();
                newOffsets = new HashMap<>();
@@ -218,22 +221,11 @@ 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();
        }
@@ -251,11 +243,32 @@ class ApplicationTests
                }
        }
 
+       public static class RecordHandler implements Consumer<ConsumerRecord<String, Long>>
+       {
+               Consumer<ConsumerRecord<String, Long>> captureOffsets;
+               Consumer<ConsumerRecord<String, Long>> testHandler;
+
+
+               @Override
+               public void accept(ConsumerRecord<String, Long> record)
+               {
+                       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)
                {