内存服务器中的Spring-Kafka由随机端口启动。因此, application.yml 条目是一个变量:
bootstrap-servers: ${spring.embedded.kafka.brokers}
但是,仅当嵌入式Kafka服务器实际运行时才设置此属性。 在没有嵌入式Kafka的单元测试中,会抛出异常(因为实际上未设置变量):
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'kafkaReceiverConfig': Injection of
autowired dependencies failed; nested exception is
java.lang.IllegalArgumentException: Could not resolve placeholder
spring.embedded.kafka.brokers' in value "${spring.embedded.kafka.brokers}"
这是Java配置类:
@Configuration
@EnableKafka
public class KafkaReceiverConfig {
@Value("${kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public KafkaReceiver kafkaReceiver() {
return new KafkaReceiver();
}
}
灵感来自here。
目前的解决方法是将嵌入式Kafka包含在每个单元测试中)-;
如何避免这种严厉措施?
答案 0 :(得分:3)
每当在测试类中使用@EmbeddedKafka
时,您都可以这样做:
static {
System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY,
"spring.kafka.bootstrap-servers");
}
因此,这种方式EmbeddedKafkaBroker
将通过随机端口将其地址公开到spring.kafka.bootstrap-servers
中。因此,您不需要在application.yml
中进行更改,并且在其他类中也不需要@EmbeddedKafka
。
更新
好!看起来您不依赖于Spring Boot自动配置及其常规属性。
因此,要使SpringKafkaApplicationTest
工作,您需要具有以下系统属性:
静态{ System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY, “ kafka.bootstrap-servers”); }
您根本不需要在kafka.bootstrap-servers
中拥有该application.yml
属性。
SpringJmsApplicationTest
的问题完全基于@SpringBootTest
,而该问题将为您的SpringApplication
加载嵌套软件包中的所有@Configuration
类,包括KafkaReceiverConfig
和KafkaSenderConfig
。我假设您不希望使用SpringJmsApplicationTest
。因此,您应该考虑不要从@SpringBootTest
加载整个应用程序。
只有在我为您的测试中看到的快速解决方案是这样的:
@SpringBootTest(classes = { ActiveMqReceiverConfig.class, ActiveMqSenderConfig.class })
public class SpringJmsApplicationTest {
我想您也可以为SpringKafkaApplicationTest
做同样的事情:
@SpringBootTest(classes = { KafkaReceiverConfig.class, KafkaSenderConfig.class })
@DirtiesContext
@EmbeddedKafka(partitions = 1,
topics = { SpringKafkaApplicationTest.HELLOWORLD_TOPIC })
public class SpringKafkaApplicationTest {