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();