Skip to content

Commit 9fbdf0f

Browse files
committed
GH-2870: EmbeddedKafka: register BeanDefinition
Fixes #2870 The `EmbeddedKafkaContextCustomizer` uses `beanFactory.initializeBean()` which is too early according to the `ApplicationContext` lifecycle since it is not refreshed yet for `ContextCustomizer` * Rework the logic in the `EmbeddedKafkaContextCustomizer` to register a `BeanDefinition` for an `EmbeddedKafkaBroker` to include it into standard `ApplicationContext` lifecycle * Also mark `@EmbeddedKafka` with a `@DisabledInAotMode` to disallow this kind of tests in native images
1 parent 9794c58 commit 9fbdf0f

File tree

5 files changed

+18
-49
lines changed

5 files changed

+18
-49
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ ext {
7575
springBootVersion = '3.0.9' // docs module
7676
springDataVersion = '2023.1.0-RC1'
7777
springRetryVersion = '2.0.4'
78-
springVersion = '6.1.0-RC1'
78+
springVersion = '6.1.0-SNAPSHOT'
7979
zookeeperVersion = '3.6.4'
8080

8181
idPrefix = 'kafka'

spring-kafka-test/src/main/java/org/springframework/kafka/test/context/EmbeddedKafka.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.kafka.test.EmbeddedKafkaBroker;
3030
import org.springframework.kafka.test.EmbeddedKafkaZKBroker;
3131
import org.springframework.kafka.test.condition.EmbeddedKafkaCondition;
32+
import org.springframework.test.context.aot.DisabledInAotMode;
3233

3334
/**
3435
* Annotation that can be specified on a test class that runs Spring for Apache Kafka
@@ -72,6 +73,7 @@
7273
@Retention(RetentionPolicy.RUNTIME)
7374
@Documented
7475
@Inherited
76+
@DisabledInAotMode
7577
public @interface EmbeddedKafka {
7678

7779
/**

spring-kafka-test/src/main/java/org/springframework/kafka/test/context/EmbeddedKafkaContextCustomizer.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import java.util.Properties;
2525

2626
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
27+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2728
import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry;
29+
import org.springframework.beans.factory.support.RootBeanDefinition;
2830
import org.springframework.context.ConfigurableApplicationContext;
2931
import org.springframework.core.env.ConfigurableEnvironment;
3032
import org.springframework.core.io.Resource;
@@ -124,9 +126,8 @@ public void customizeContext(ConfigurableApplicationContext context, MergedConte
124126
embeddedKafkaBroker.brokerListProperty(this.embeddedKafka.bootstrapServersProperty());
125127
}
126128

127-
beanFactory.initializeBean(embeddedKafkaBroker, EmbeddedKafkaBroker.BEAN_NAME);
128-
beanFactory.registerSingleton(EmbeddedKafkaBroker.BEAN_NAME, embeddedKafkaBroker);
129-
((DefaultSingletonBeanRegistry) beanFactory).registerDisposableBean(EmbeddedKafkaBroker.BEAN_NAME, embeddedKafkaBroker);
129+
((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(EmbeddedKafkaBroker.BEAN_NAME,
130+
new RootBeanDefinition(EmbeddedKafkaBroker.class, () -> embeddedKafkaBroker));
130131
}
131132

132133
private int[] setupPorts() {

spring-kafka-test/src/test/java/org/springframework/kafka/test/context/EmbeddedKafkaContextCustomizerTests.java

Lines changed: 10 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,13 @@
1717
package org.springframework.kafka.test.context;
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
20-
import static org.mockito.BDDMockito.given;
21-
import static org.mockito.Mockito.mock;
2220

2321
import org.junit.jupiter.api.BeforeEach;
2422
import org.junit.jupiter.api.Test;
2523

26-
import org.springframework.beans.BeansException;
27-
import org.springframework.beans.factory.DisposableBean;
28-
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
2924
import org.springframework.context.ConfigurableApplicationContext;
25+
import org.springframework.context.support.GenericApplicationContext;
3026
import org.springframework.core.annotation.AnnotationUtils;
31-
import org.springframework.core.env.ConfigurableEnvironment;
3227
import org.springframework.kafka.test.EmbeddedKafkaBroker;
3328
import org.springframework.kafka.test.utils.KafkaTestUtils;
3429

@@ -75,15 +70,14 @@ void testPorts() {
7570
EmbeddedKafka annotationWithPorts =
7671
AnnotationUtils.findAnnotation(TestWithEmbeddedKafkaPorts.class, EmbeddedKafka.class);
7772
EmbeddedKafkaContextCustomizer customizer = new EmbeddedKafkaContextCustomizer(annotationWithPorts);
78-
ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
79-
BeanFactoryStub factoryStub = new BeanFactoryStub();
80-
given(context.getBeanFactory()).willReturn(factoryStub);
81-
given(context.getEnvironment()).willReturn(mock(ConfigurableEnvironment.class));
73+
ConfigurableApplicationContext context = new GenericApplicationContext();
8274
customizer.customizeContext(context, null);
75+
context.refresh();
8376

84-
assertThat(factoryStub.getBroker().getBrokersAsString())
77+
EmbeddedKafkaBroker embeddedKafkaBroker = context.getBean(EmbeddedKafkaBroker.class);
78+
assertThat(embeddedKafkaBroker.getBrokersAsString())
8579
.isEqualTo("127.0.0.1:" + annotationWithPorts.ports()[0]);
86-
assertThat(KafkaTestUtils.getPropertyValue(factoryStub.getBroker(), "brokerListProperty"))
80+
assertThat(KafkaTestUtils.getPropertyValue(embeddedKafkaBroker, "brokerListProperty"))
8781
.isEqualTo("my.bss.prop");
8882
}
8983

@@ -92,14 +86,12 @@ void testMulti() {
9286
EmbeddedKafka annotationWithPorts =
9387
AnnotationUtils.findAnnotation(TestWithEmbeddedKafkaMulti.class, EmbeddedKafka.class);
9488
EmbeddedKafkaContextCustomizer customizer = new EmbeddedKafkaContextCustomizer(annotationWithPorts);
95-
ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
96-
BeanFactoryStub factoryStub = new BeanFactoryStub();
97-
given(context.getBeanFactory()).willReturn(factoryStub);
98-
given(context.getEnvironment()).willReturn(mock(ConfigurableEnvironment.class));
89+
ConfigurableApplicationContext context = new GenericApplicationContext();
9990
customizer.customizeContext(context, null);
91+
context.refresh();
10092

101-
assertThat(factoryStub.getBroker().getBrokersAsString())
102-
.matches("127.0.0.1:[0-9]+,127.0.0.1:[0-9]+");
93+
assertThat(context.getBean(EmbeddedKafkaBroker.class).getBrokersAsString())
94+
.matches("127.0.0.1:[0-9]+,127.0.0.1:[0-9]+");
10395
}
10496

10597

@@ -122,31 +114,5 @@ private class TestWithEmbeddedKafkaPorts {
122114
private class TestWithEmbeddedKafkaMulti {
123115

124116
}
125-
@SuppressWarnings("serial")
126-
private class BeanFactoryStub extends DefaultListableBeanFactory {
127-
128-
private Object bean;
129-
130-
public EmbeddedKafkaBroker getBroker() {
131-
return (EmbeddedKafkaBroker) bean;
132-
}
133-
134-
@Override
135-
public Object initializeBean(Object existingBean, String beanName) throws BeansException {
136-
this.bean = existingBean;
137-
return bean;
138-
}
139-
140-
@Override
141-
public void registerSingleton(String beanName, Object singletonObject) {
142-
143-
}
144-
145-
@Override
146-
public void registerDisposableBean(String beanName, DisposableBean bean) {
147-
148-
}
149-
150-
}
151117

152118
}

spring-kafka-test/src/test/java/org/springframework/kafka/test/utils/KafkaTestUtilsTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* @since 2.2.7
4141
*
4242
*/
43-
@EmbeddedKafka(topics = { "singleTopic1", "singleTopic2", "singleTopic3", "singleTopic4", "singleTopic5",
43+
@EmbeddedKafka(kraft = false, topics = { "singleTopic1", "singleTopic2", "singleTopic3", "singleTopic4", "singleTopic5",
4444
"multiTopic1" })
4545
public class KafkaTestUtilsTests {
4646

0 commit comments

Comments
 (0)