【问题标题】:How to check if @KafkaListener was invoked in integration test?如何检查是否在集成测试中调用了@KafkaListener?
【发布时间】:2020-02-19 11:08:32
【问题描述】:

我想为整个 kafka 流程编写一个集成测试。

在我的生产代码中,我有:

@KafkaListener(topics = "myTopic")
public void listen(@Payload String payload) {
    log.debug("processing payload: '{}' ", payload);
    // business logic here
}

在我的测试代码中,我使用KafkaProducer<String, String> producer; 向特定主题发送消息。

我想要一个钩子来表明 @KafkaListener 被调用。 我可以在测试中插入一些延迟,但这是一种不好的做法,我想避免它。

有没有更好的方法来等待@KafkaListener 被处理?

【问题讨论】:

  • @asolanki 我测试的是 kafka 事件而不是 spring 应用程序事件
  • 我认为@asolanki 的观点是可以使用相同的方法。这在单元测试中很典型,你模拟与外部服务交互的东西。在这种情况下,您将嘲笑卡夫卡。然后,在运行测试之后,您断言是否调用了特定的东西,在您的情况下为 KafkaListener。但是,在您的示例中,我相信您想使用真实的 Kafka 环境进行测试。对吗?
  • 但我不想对它进行单元测试——我想对使用 Testcontainers 实例化的 kafka 进行完整的集成测试。当然我可以直接作为单元运行我的监听器,但它会错过集成测试的全部意义

标签: java apache-kafka integration-testing spring-kafka


【解决方案1】:

如果您的侦听器调用某个服务,您可以为该服务注入一个模拟并验证它是否被调用。

此外,您可以将侦听器包装在测试用例中并添加倒计时锁存器。

有关示例,请参阅 this answer

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多