Skip to content

Commit 5c7d7b8

Browse files
committed
Add integration test for @headers annotation
Signed-off-by: sullis <[email protected]>
1 parent 525a756 commit 5c7d7b8

File tree

1 file changed

+73
-1
lines changed

1 file changed

+73
-1
lines changed

spring-kafka/src/test/java/org/springframework/kafka/annotation/EnableKafkaIntegrationTests.java

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.apache.kafka.common.errors.TopicExistsException;
6464
import org.apache.kafka.common.serialization.ByteArrayDeserializer;
6565
import org.apache.kafka.common.serialization.ByteArraySerializer;
66+
import org.awaitility.Awaitility;
6667
import org.jspecify.annotations.NonNull;
6768
import org.jspecify.annotations.Nullable;
6869
import org.junit.jupiter.api.Test;
@@ -141,6 +142,7 @@
141142
import org.springframework.messaging.converter.AbstractMessageConverter;
142143
import org.springframework.messaging.converter.SmartMessageConverter;
143144
import org.springframework.messaging.handler.annotation.Header;
145+
import org.springframework.messaging.handler.annotation.Headers;
144146
import org.springframework.messaging.handler.annotation.Payload;
145147
import org.springframework.messaging.handler.annotation.SendTo;
146148
import org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException;
@@ -181,6 +183,7 @@
181183
* @author Soby Chacko
182184
* @author Wang Zhiyang
183185
* @author Borahm Lee
186+
* @author Sean Sullivan
184187
*/
185188
@SpringJUnitConfig
186189
@DirtiesContext
@@ -196,7 +199,8 @@
196199
"annotated29", "annotated30", "annotated30reply", "annotated31", "annotated32", "annotated33",
197200
"annotated34", "annotated35", "annotated36", "annotated37", "foo", "manualStart", "seekOnIdle",
198201
"annotated38", "annotated38reply", "annotated39", "annotated40", "annotated41", "annotated42",
199-
"annotated43", "annotated43reply", "seekToComputeFn"})
202+
"annotated43", "annotated43reply", "seekToComputeFn",
203+
"headerMapTopic"})
200204
@TestPropertySource(properties = "spel.props=fetch.min.bytes=420000,max.poll.records=10")
201205
public class EnableKafkaIntegrationTests {
202206

@@ -242,6 +246,9 @@ public class EnableKafkaIntegrationTests {
242246
@Autowired
243247
public MultiJsonListenerBean multiJsonListener;
244248

249+
@Autowired
250+
public HeaderMapListenerBean headerMapListener;
251+
245252
@Autowired
246253
public MultiListenerNoDefault multiNoDefault;
247254

@@ -584,6 +591,50 @@ public void testMultiJson() throws Exception {
584591
assertThat(this.multiJsonListener.validated.valCount).isEqualTo(1);
585592
}
586593

594+
@Test
595+
public void testHeadersAnnotation() throws Exception {
596+
template.setDefaultTopic("headerMapTopic");
597+
598+
template.send(new GenericMessage<>("message1", Collections.emptyMap()));
599+
Awaitility.await().untilAsserted(() -> {
600+
assertThat(this.headerMapListener.invocationCount.get()).isEqualTo(1);
601+
});
602+
assertThat(this.headerMapListener.text).isEqualTo("message1");
603+
assertThat(this.headerMapListener.headers)
604+
.isNotNull()
605+
.containsOnlyKeys(
606+
"kafka_offset",
607+
"kafka_consumer",
608+
"kafka_timestampType",
609+
"kafka_receivedPartitionId",
610+
"kafka_receivedTopic",
611+
"kafka_receivedTimestamp",
612+
"kafka_groupId");
613+
614+
template.send(new GenericMessage<>("message2",
615+
Map.of("akey", "avalue",
616+
"bkey", "bvalue")));
617+
Awaitility.await().untilAsserted(() -> {
618+
assertThat(this.headerMapListener.invocationCount.get()).isEqualTo(2);
619+
});
620+
assertThat(this.headerMapListener.text).isEqualTo("message2");
621+
assertThat(this.headerMapListener.headers)
622+
.isNotNull()
623+
.containsOnlyKeys(
624+
"kafka_offset",
625+
"kafka_consumer",
626+
"kafka_timestampType",
627+
"kafka_receivedPartitionId",
628+
"kafka_receivedTopic",
629+
"kafka_receivedTimestamp",
630+
"kafka_groupId",
631+
"akey",
632+
"bkey")
633+
.contains(
634+
Map.entry("akey", "avalue"),
635+
Map.entry("bkey", "bvalue"));
636+
}
637+
587638
@Test
588639
public void testMultiValidateNoDefaultHandler() throws Exception {
589640
this.kafkaJsonTemplate.setDefaultTopic("annotated40");
@@ -1545,6 +1596,11 @@ public MultiJsonListenerBean multiJsonListener() {
15451596
return new MultiJsonListenerBean();
15461597
}
15471598

1599+
@Bean
1600+
public HeaderMapListenerBean headerMapListener() {
1601+
return new HeaderMapListenerBean();
1602+
}
1603+
15481604
@Bean
15491605
public MultiListenerNoDefault multiNoDefault() {
15501606
return new MultiListenerNoDefault();
@@ -2742,6 +2798,22 @@ public void defaultHandler(Bar bar) {
27422798

27432799
}
27442800

2801+
@KafkaListener(id = "headerMap", topics = "headerMapTopic")
2802+
static class HeaderMapListenerBean {
2803+
2804+
final AtomicInteger invocationCount = new AtomicInteger();
2805+
private String text;
2806+
private Map<String, Object> headers;
2807+
2808+
@KafkaHandler(isDefault = true)
2809+
public void defaultHandler(@Payload String text, @Headers Map<String, Object> headers) {
2810+
this.text = text;
2811+
this.headers = headers;
2812+
this.invocationCount.incrementAndGet();
2813+
}
2814+
2815+
}
2816+
27452817
@KafkaListener(id = "multiNoDefault", topics = "annotated40", containerFactory = "kafkaJsonListenerContainerFactory2")
27462818
static class MultiListenerNoDefault {
27472819

0 commit comments

Comments
 (0)