我在SpringBoot应用程序中使用spring-kafka依赖性来使用Kafka。
在我的Kafka实例启动并运行之前,一切正常,但是问题是我的 unit&integration 测试,它们在我的本地环境中运行良好,但在我的部署管道中却没有运行(应用程序尝试在运行测试且无法找到任何东西的情况下[在我的构建管道中]与Kafka实例连接),因此最终出现以下错误:
[Consumer clientId=consumer-1, groupId=biz-web-group-test] Connection to node -1
could not be established. Broker may not be available.
这只有在我有一个用@KafkaListener
注释
@KafkaListener(topics = "${biz-web.kafka.message.topic.name}", groupId = "${biz-web.kafka.message.group.id}")
public void listenToKafkaMessages(ConsumerRecord consumerRecord) {
// Some Logic
}
我对//
进行注释时,测试用例就可以正常工作。
是否可以在运行单元/集成测试时排除与kafka相关的配置或此批注。
答案 0 :(得分:0)
如前所述,spring-test-kafka是要在单元/集成测试中使用的库。
EmbeddedKafkaBroker :嵌入式Kafka经纪人和Zookeeper管理器。该类打算在单元测试中使用。
EmbeddedKafkaTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
@EmbeddedKafka(topics= {"test"},count=1,partitions=1)
public class EmbeddedKafkaTest {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@Autowired
private EmbeddedKafkaBroker embeddedKafka;
private KafkaTemplate<Integer, String> kafkaTemplate;
@Test
public void testConsumer() {
Map<String, Object> producerProps=KafkaTestUtils.producerProps(this.embeddedKafka);
ProducerFactory<Integer, String> producerFactory = new DefaultKafkaProducerFactory<>(producerProps);
this.kafkaTemplate = new KafkaTemplate<>(producerFactory);
logger.info("embedded kafka ",embeddedKafka);
kafkaTemplate.send("test", "hello");
Map<String, Object> consumerProps = KafkaTestUtils.consumerProps("demo-group", "true", this.embeddedKafka);
consumerProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
ConsumerFactory<Integer, String> cf = new DefaultKafkaConsumerFactory<>(consumerProps);
Consumer<Integer, String> consumer = cf.createConsumer();
this.embeddedKafka.consumeFromAnEmbeddedTopic(consumer, "test");
ConsumerRecords<Integer, String> replies = KafkaTestUtils.getRecords(consumer);
Assert.assertTrue(replies.count() == 1);
}
}
但是,您也可以通过在测试用例中排除KafkaAutoConfiguration
来忽略kafka处理注释。
注意:仅在使用自动配置时适用。如果是自定义配置,请确保依赖关系松散耦合,以忽略依赖关系注入问题。
AppTestWithoutKafka.java
@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAutoConfiguration(exclude=KafkaAutoConfiguration.class)
public class AppTestWithoutKafka {
@Test
public void contextLoads() {
System.out.println("context loads");
}
}