Spring boot 使用JUnit 5和EmbeddedKafkaBroker在Spring Boot应用程序中测试Apache Kafka集成

Spring boot 使用JUnit 5和EmbeddedKafkaBroker在Spring Boot应用程序中测试Apache Kafka集成,spring-boot,spring-kafka,spring-test,Spring Boot,Spring Kafka,Spring Test,我有一个简单的生产者类,定义如下: @配置 公共类MyKafkaProducer{ 私有最终静态记录器log=LoggerFactory.getLogger(MyKafkaProducer.class); @值(${my.kafka.producer.topic}) 私有字符串主题; @自动连线 卡夫卡坦普尔卡夫卡坦普尔; public void sendDataToKafka(@RequestParam String data){ ListenableFuture ListenableFutu

我有一个简单的生产者类,定义如下:

@配置
公共类MyKafkaProducer{
私有最终静态记录器log=LoggerFactory.getLogger(MyKafkaProducer.class);
@值(${my.kafka.producer.topic})
私有字符串主题;
@自动连线
卡夫卡坦普尔卡夫卡坦普尔;
public void sendDataToKafka(@RequestParam String data){
ListenableFuture ListenableFuture=kafkaTemplate.send(主题,数据);
addCallback(新的ListenableFutureCallback(){
@凌驾
成功时公共无效(SendResult结果){
log.info(“发送的数据{}”,result.getProducerRecord().value());
}
@凌驾
失效时的公共无效(可丢弃的ex){
错误(“无法发送数据{},原因是:{}”,数据,例如getMessage());
}
});
}
}
这是正在进行的测试课程:

@EmbeddedKafka
@ExtendWith(SpringExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_类)
MyKafkaProducerTest类{
私有静态最终字符串TOPIC=“device”;
@自动连线
私人嵌入卡夫卡布洛克嵌入卡夫卡布洛克;
@自动连线
私营MyKafkaProducer生产商;
封锁队列记录;
卡夫卡信使集装箱;
@以前
无效设置(){
Map configs=newhashmap(KafkaTestUtils.consumerProps(“consumer”,“false”,embeddedKafkaBroker));
DefaultKafkanConsumerFactory consumerFactory=new DefaultKafkanConsumerFactory(配置,new StringDeserializer(),new StringDeserializer());
ContainerProperties ContainerProperties=新的ContainerProperty(主题);
容器=新的KafkaMessageListenerContainer(consumerFactory、containerProperties);
记录=新建LinkedBlockingQueue();
container.setupMessageListener((MessageListener)记录::add);
container.start();
ContainerTestUtils.waitForAssignment(容器,embeddedKafkaBroker.getPartitionsPerTopic());
}
@毕竟
void tearDown(){
container.stop();
}
@试验
public void testIfWorks()引发InterruptedException{
//安排
Map configs=newhashmap(KafkaTestUtils.producerProps(嵌入式kafkabroker));
Producer-Producer=new DefaultKafkaProducerFactory(配置,新StringSerializer(),新StringSerializer()).createProducer();
//表演
send(新的ProducerRecord(主题,“我的聚合id”,“事件”:“测试事件”);
producer.flush();
//断言
ConsumerRecord singleRecord=records.poll(100,时间单位为毫秒);
assertThat(singleRecord).isNotNull();
assertThat(singleRecord.key()).isEqualTo(“我的聚合id”);
assertThat(singleRecord.value()).isEqualTo(“{\”事件\“:\”测试事件\“}”);
}
问题是测试创建了一个默认生产者:

Producer-Producer=new-DefaultKafkaProducerFactory(configs,new-StringSerializer(),new-StringSerializer()).createProducer();
我如何使用我自己的制作人,
MyKafkaProducer
,并调用它的
sendDataToKafka
方法?在这种情况下,我们可以如何测试

可以找到源代码。 正在进行工作测试的分支为。
谢谢。

这是一个Spring启动应用程序,您使用的是自动配置的
KafkaTemplate

要覆盖引导服务器以使用嵌入式kafka代理,请参阅

@EmbeddedKafka(topics=“someTopic”,
bootstrapServersProperty=“spring.kafka.bootstrap服务器”)

然后,您可以从测试用例中调用生产者。

因此它是一个Spring引导应用程序,您使用的是自动配置的
KafkaTemplate

要覆盖引导服务器以使用嵌入式kafka代理,请参阅

@EmbeddedKafka(topics=“someTopic”,
bootstrapServersProperty=“spring.kafka.bootstrap服务器”)

然后,您可以从测试用例中调用您的生产者。

您需要展示如何在生产者中配置
KafkaTemplate
及其生产者工厂。底线是您必须强制它使用嵌入式kafka代理地址,但我们无法帮到您,除非您展示如何配置它。嗨,Gary,感谢您的帮助他回答。类
MyKafkaProducer
与上面发布的内容相同,仅此而已。但是连接到它的
kafkatTemplate
呢;它在哪里配置?我刚刚将最新的修改推送到GitHub repo,并用它的链接更新了帖子。@GaryRussell,至于
kafkatTemplate
,不,它是just使用
@Autowired
注释注入producer类。或者我缺少smth?您需要说明如何在producer中配置
KafkaTemplate
及其producer工厂。底线是您必须强制它使用嵌入式kafka代理地址,但除非您说明如何配置,否则我们无法提供帮助配置它。嗨,加里,谢谢你的回复。类
MyKafkaProducer
与上面发布的一样,仅此而已。但是连接到它的
KafkaTemplate
呢;配置在哪里?我刚刚将最新的修改推送到GitHub repo,并用它的链接更新了帖子。@GaryRussell,至于
KafkaTemplate
,不,它只是用
@Autowired
注释注入到producer类中。或者我缺少smth?我添加了上面的注释,以及声明的
私有MyKafkaProducer MyKafkaProducer;
@Autowired
注释。然后创建了一个简单的测试方法来检查它:
assertTrue(myKafkaProducer!=null);
。由于以下原因导致
失败:org.springframework.beans.factory.NoSuchBeanDefinitionException:No