猿问

使用嵌入式 Kafka 进行春季 Kafka 集成测试

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


现在我正在尝试使用 spring 嵌入式 Kafka 编写集成测试用例,但遇到了问题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,这样当我调用其中的kafkaConsumerService.professor方法时,Test它应该将数据生成到嵌入式 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;

   }


 }


慕村9548890
浏览 172回答 1
1回答

月关宝盒

Boot 2.1默认禁用 bean 覆盖。默认情况下禁用 Bean 覆盖,以防止意外覆盖 bean。如果您依赖于覆盖,则需要设置spring.main.allow-bean-definition-overriding为true.关于弃用;请参阅 .java 文档@EmbeddedKafka。它被替换为EmbeddedKafkaBroker。
随时随地看视频慕课网APP

相关分类

Java
我要回答