繁体   English   中英

spring Kafka 与嵌入式 Kafka 的集成测试

[英]spring Kafka integration testing with embedded Kafka

我有一个 Spring Boot 应用程序,它有一个消费者从一个集群中的主题消费,并在不同集群中生产到另一个主题。

现在我正在尝试使用 spring 嵌入式 Kafka 编写集成测试用例,但是遇到了KafkaTemplate could not be registered. A bean with that name has already been defined in class path resource的问题KafkaTemplate could not be registered. A bean with that name has already been defined in class path resource KafkaTemplate could not be registered. A bean with that name has already been defined in class path resource

消费类

@Service
public class KafkaConsumerService {

@Autowired
private KafkaProducerService kafkaProducerService;

@KafkaListener(topics = "${kafka.producer.topic}")
public void professor(List<Professor> pro) {
    pro.forEach(kafkaProducerService::produce);
    
   }

}

生产者类

@Service
public class KafkaProducerService {

@Value("${kafka.producer.topic}")
private String topic;

@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;

public void produce(Professor pro) {
    kafkaTemplate.send(topic,"professor",pro);
  }

 }

在我的测试用例中,我想覆盖KafkaTemplate这样当我在Test调用kafkaConsumerService.professor方法时,它应该将数据生成到嵌入式 Kafka 中,我应该验证它。

测试配置

@TestConfiguration
@EmbeddedKafka(partitions = 1, controlledShutdown = false,
brokerProperties = {"listeners=PLAINTEXT://localhost:3333", "port=3333"})
public class KafkaProducerConfigTest {

@Autowired
 KafkaEmbedded kafkaEmbeded;

@Autowired
KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;

@Before
public void setUp() throws Exception {
  for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) {
    ContainerTestUtils.waitForAssignment(messageListenerContainer, 
    kafkaEmbeded.getPartitionsPerTopic());
  }
}

@Bean
public ProducerFactory<String, Object> producerFactory() {
    return new DefaultKafkaProducerFactory<>(KafkaTestUtils.producerProps(kafkaEmbeded));
}

@Bean
public KafkaTemplate<String, Object> kafkaTemplate() {
    KafkaTemplate<String, Object> kafkaTemplate = new KafkaTemplate<>(producerFactory());
    return kafkaTemplate;
   }

 }

测试班

@EnableKafka
@SpringBootTest(classes = {KafkaProducerConfigTest.class})
@RunWith(SpringRunner.class)
public class KafkaProducerServiceTest {

@Autowired
private KafkaConsumerService kafkaConsumerService;

@Test
public void testReceive() throws Exception {
     kafkaConsumerService.professor(Arrays.asList(new Professor()));
     
     //How to check messages is sent to kafka?
}

 }

错误

 The bean 'kafkaTemplate', defined in com.kafka.configuration.KafkaProducerConfigTest, could not be registered. 
 A bean with that name has already been defined in class path resource [com/kafka/configuration/KafkaProducerConfig.class] and overriding is disabled.
 Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

还有人可以帮助我如何验证发送到嵌入式 Kafka 服务器的消息吗?

注意我有一些已弃用的警告

KafkaEmbedded 类型已弃用

不推荐使用 KafkaEmbedded 类型的 getPartitionsPerTopic() 方法

不推荐使用 KafkaTestUtils 类型中的 producerProps(KafkaEmbedded) 方法

Boot 2.1 默认禁用 bean 覆盖

默认情况下已禁用 Bean 覆盖,以防止 Bean 被意外覆盖。 如果您依赖覆盖,则需要将spring.main.allow-bean-definition-overriding设置为true

关于弃用; 请参阅@EmbeddedKafka的 javadoc。 它被EmbeddedKafkaBroker取代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM