From 8e9afd79ac2b6cd594ad8428c607f2ddb5cf8b79 Mon Sep 17 00:00:00 2001 From: lingniu Date: Tue, 23 Jun 2026 16:45:32 +0800 Subject: [PATCH] test: make split composition tests hermetic --- .../gb32960app/Gb32960IngestAppCompositionTest.java | 11 +++++++++++ .../VehicleAnalyticsAppCompositionTest.java | 13 +++++++++++++ .../VehicleHistoryAppCompositionTest.java | 13 +++++++++++++ 3 files changed, 37 insertions(+) diff --git a/modules/apps/gb32960-ingest-app/src/test/java/com/lingniu/ingest/gb32960app/Gb32960IngestAppCompositionTest.java b/modules/apps/gb32960-ingest-app/src/test/java/com/lingniu/ingest/gb32960app/Gb32960IngestAppCompositionTest.java index 34fee58d..8640ed51 100644 --- a/modules/apps/gb32960-ingest-app/src/test/java/com/lingniu/ingest/gb32960app/Gb32960IngestAppCompositionTest.java +++ b/modules/apps/gb32960-ingest-app/src/test/java/com/lingniu/ingest/gb32960app/Gb32960IngestAppCompositionTest.java @@ -6,7 +6,9 @@ import com.lingniu.ingest.protocol.gb32960.config.Gb32960AutoConfiguration; import com.lingniu.ingest.protocol.gb32960.inbound.Gb32960NettyServer; import com.lingniu.ingest.session.config.SessionCoreAutoConfiguration; import com.lingniu.ingest.sink.mq.KafkaEventSink; +import com.lingniu.ingest.sink.mq.KafkaEnvelopeDeadLetterSink; import com.lingniu.ingest.sink.mq.SinkMqAutoConfiguration; +import org.apache.kafka.clients.producer.KafkaProducer; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -14,6 +16,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class Gb32960IngestAppCompositionTest { @@ -23,6 +26,8 @@ class Gb32960IngestAppCompositionTest { SessionCoreAutoConfiguration.class, SinkMqAutoConfiguration.class, Gb32960AutoConfiguration.class)) + .withAllowBeanDefinitionOverriding(true) + .withBean("kafkaProducer", KafkaProducer.class, Gb32960IngestAppCompositionTest::kafkaProducer) .withPropertyValues( "lingniu.ingest.gb32960.enabled=true", "lingniu.ingest.gb32960.server.enabled=true", @@ -43,12 +48,18 @@ class Gb32960IngestAppCompositionTest { assertThat(context).hasSingleBean(Gb32960MessageDecoder.class); assertThat(context).hasSingleBean(Gb32960NettyServer.class); assertThat(context).hasSingleBean(KafkaEventSink.class); + assertThat(context).hasSingleBean(KafkaEnvelopeDeadLetterSink.class); assertTypeNotPresent(context, "com.lingniu.ingest.sink.archive.ArchiveStore"); assertTypeNotPresent(context, "com.lingniu.ingest.eventfilestore.EventFileStore"); }); } + @SuppressWarnings("unchecked") + private static KafkaProducer kafkaProducer() { + return mock(KafkaProducer.class); + } + private static void assertTypeNotPresent(ApplicationContext context, String className) { assertThat(ClassUtils.isPresent(className, context.getClassLoader())) .as("%s must stay outside the GB32960 ingest runtime", className) diff --git a/modules/apps/vehicle-analytics-app/src/test/java/com/lingniu/ingest/analyticsapp/VehicleAnalyticsAppCompositionTest.java b/modules/apps/vehicle-analytics-app/src/test/java/com/lingniu/ingest/analyticsapp/VehicleAnalyticsAppCompositionTest.java index 9020368d..110345cf 100644 --- a/modules/apps/vehicle-analytics-app/src/test/java/com/lingniu/ingest/analyticsapp/VehicleAnalyticsAppCompositionTest.java +++ b/modules/apps/vehicle-analytics-app/src/test/java/com/lingniu/ingest/analyticsapp/VehicleAnalyticsAppCompositionTest.java @@ -1,6 +1,8 @@ package com.lingniu.ingest.analyticsapp; import com.lingniu.ingest.api.consumer.EnvelopeConsumerProcessor; +import com.lingniu.ingest.sink.mq.KafkaEnvelopeDeadLetterSink; +import com.lingniu.ingest.sink.mq.KafkaEventSink; import com.lingniu.ingest.sink.mq.SinkMqAutoConfiguration; import com.lingniu.ingest.vehiclestate.VehicleStateEnvelopeIngestor; import com.lingniu.ingest.vehiclestate.config.VehicleStateAutoConfiguration; @@ -12,6 +14,7 @@ import com.lingniu.ingest.vehiclestat.VehicleStatEventProcessor; import com.lingniu.ingest.vehiclestat.VehicleStatEventSink; import com.lingniu.ingest.vehiclestat.VehicleStatRepository; import com.lingniu.ingest.vehiclestat.config.VehicleStatAutoConfiguration; +import org.apache.kafka.clients.producer.KafkaProducer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -22,6 +25,7 @@ import org.springframework.util.ClassUtils; import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class VehicleAnalyticsAppCompositionTest { @@ -35,6 +39,8 @@ class VehicleAnalyticsAppCompositionTest { SinkMqAutoConfiguration.class, VehicleStateAutoConfiguration.class, VehicleStatAutoConfiguration.class)) + .withAllowBeanDefinitionOverriding(true) + .withBean("kafkaProducer", KafkaProducer.class, VehicleAnalyticsAppCompositionTest::kafkaProducer) .withPropertyValues( "lingniu.ingest.sink.mq.enabled=true", "lingniu.ingest.sink.mq.type=kafka", @@ -54,6 +60,8 @@ class VehicleAnalyticsAppCompositionTest { assertThat(context).hasSingleBean(VehicleStatEnvelopeIngestor.class); assertThat(context).hasSingleBean(VehicleStatEventSink.class); assertThat(context).hasSingleBean(VehicleStatController.class); + assertThat(context).hasSingleBean(KafkaEventSink.class); + assertThat(context).hasSingleBean(KafkaEnvelopeDeadLetterSink.class); assertThat(context).hasBean("vehicleStatEnvelopeConsumerProcessor"); assertThat(context.getBean("vehicleStatEnvelopeConsumerProcessor")) .isInstanceOf(EnvelopeConsumerProcessor.class); @@ -64,6 +72,11 @@ class VehicleAnalyticsAppCompositionTest { }); } + @SuppressWarnings("unchecked") + private static KafkaProducer kafkaProducer() { + return mock(KafkaProducer.class); + } + private static void assertTypeNotPresent(ApplicationContext context, String className) { assertThat(ClassUtils.isPresent(className, context.getClassLoader())) .as("%s must stay outside the vehicle analytics runtime", className) diff --git a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/VehicleHistoryAppCompositionTest.java b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/VehicleHistoryAppCompositionTest.java index c505bc6f..e05ab364 100644 --- a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/VehicleHistoryAppCompositionTest.java +++ b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/VehicleHistoryAppCompositionTest.java @@ -14,7 +14,10 @@ import com.lingniu.ingest.protocol.gb32960.inbound.Gb32960NettyServer; import com.lingniu.ingest.sink.archive.ArchiveStore; import com.lingniu.ingest.sink.archive.RawArchiveEventSink; import com.lingniu.ingest.sink.archive.config.SinkArchiveAutoConfiguration; +import com.lingniu.ingest.sink.mq.KafkaEnvelopeDeadLetterSink; +import com.lingniu.ingest.sink.mq.KafkaEventSink; import com.lingniu.ingest.sink.mq.SinkMqAutoConfiguration; +import org.apache.kafka.clients.producer.KafkaProducer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -23,6 +26,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class VehicleHistoryAppCompositionTest { @@ -38,6 +42,8 @@ class VehicleHistoryAppCompositionTest { SinkMqAutoConfiguration.class, Gb32960AutoConfiguration.class, EventHistoryAutoConfiguration.class)) + .withAllowBeanDefinitionOverriding(true) + .withBean("kafkaProducer", KafkaProducer.class, VehicleHistoryAppCompositionTest::kafkaProducer) .withPropertyValues( "lingniu.ingest.sink.archive.enabled=true", "lingniu.ingest.sink.archive.type=local", @@ -58,6 +64,8 @@ class VehicleHistoryAppCompositionTest { assertThat(context).hasSingleBean(RawArchiveEventSink.class); assertThat(context).hasSingleBean(EventFileStore.class); assertThat(context).hasSingleBean(EventFileStoreSink.class); + assertThat(context).hasSingleBean(KafkaEventSink.class); + assertThat(context).hasSingleBean(KafkaEnvelopeDeadLetterSink.class); assertThat(context).hasSingleBean(EventHistoryEnvelopeIngestor.class); assertThat(context).hasSingleBean(EventHistoryController.class); @@ -67,4 +75,9 @@ class VehicleHistoryAppCompositionTest { assertThat(context).doesNotHaveBean(Gb32960NettyServer.class); }); } + + @SuppressWarnings("unchecked") + private static KafkaProducer kafkaProducer() { + return mock(KafkaProducer.class); + } }