Java 为Kafka消费者编写JUnit测试
我有一个卡夫卡消费者正在订阅一个主题。实施工作进展顺利。但是,当尝试为它实现单元测试时,会出现一个问题,因为它是通过Java 为Kafka消费者编写JUnit测试,java,apache-kafka,Java,Apache Kafka,我有一个卡夫卡消费者正在订阅一个主题。实施工作进展顺利。但是,当尝试为它实现单元测试时,会出现一个问题,因为它是通过Runnable接口实现的 实施 @Override public void run() { kafkaConsumer.subscribe(kafkaTopics); while (true) { ConsumerRecords<String, String> records = kafkaConsumer.poll(1000);
Runnable
接口实现的
实施
@Override
public void run() {
kafkaConsumer.subscribe(kafkaTopics);
while (true) {
ConsumerRecords<String, String> records = kafkaConsumer.poll(1000);
Map<String, InventoryStock> skuMap = new LinkedHashMap<>();
try {
// populating sku map with consumer record
for (ConsumerRecord<String, String> record : records) {
populateMap(skuMap, record.value());
}
if (MapUtils.isNotEmpty(skuMap)) {
// writing sku inventory with populated sku map
inventoryDao.updateInventoryTable(INVENTORY_JOB_ID, skuMap);
}
} catch (Exception e) {
}
kafkaConsumer.commitAsync();
}
}
由于它是一个
可运行的
,且消费者未暴露,因此该测试未按预期工作。如何解决这个问题?我建议使用Mockito,如下面的示例所示
Consumer<String, String> kafkaConsumerLocal = mock(Consumer.class);
KafkaConsumer kafkaConsumer = spy(new KafkaConsumer("topic-name));
ReflectionTestUtils.setField(kafkaConsumer, "threadPoolCount", 1);
ReflectionTestUtils.setField(kafkaConsumer, "consumer", kafkaConsumerLocal);
doNothing().when(kafkaConsumer).runConsumer();
doNothing().when(kafkaConsumer).addShutDownHook();
doReturn(kafkaConsumerLocal).when(consumerInit).getKafkaConsumer();
Consumer-kafkaConsumerLocal=mock(Consumer.class);
卡夫卡消费者卡夫卡消费者=间谍(新卡夫卡消费者(“主题名称”);
ReflectionTestUtils.setField(kafkaConsumer,“threadPoolCount”,1);
ReflectionTestUtils.setField(kafkaConsumer,“消费者”,kafkaConsumerLocal);
doNothing().when(kafkaConsumer.runConsumer();
doNothing().when(kafkaConsumer.addShutDownHook();
doReturn(kafkaConsumerLocal).when(consumerInit.getKafkaConsumer();
您想测试什么?也许您可以添加倒计时闩锁,以便在消费者消费时获得回调(不是mockito方式或多线程方式)你找到如何测试消费者了吗?没有。找不到一种方法来测试由Runnable
实现的消费者。但是找到了一些方法来测试普通类中实现的普通消费者。你能给我们共享一个链接吗?我现在没有。给我一些时间。我会用链接ping你。
Consumer<String, String> kafkaConsumerLocal = mock(Consumer.class);
KafkaConsumer kafkaConsumer = spy(new KafkaConsumer("topic-name));
ReflectionTestUtils.setField(kafkaConsumer, "threadPoolCount", 1);
ReflectionTestUtils.setField(kafkaConsumer, "consumer", kafkaConsumerLocal);
doNothing().when(kafkaConsumer).runConsumer();
doNothing().when(kafkaConsumer).addShutDownHook();
doReturn(kafkaConsumerLocal).when(consumerInit).getKafkaConsumer();