如何使用“ withRunningKafka”与Embedded-Kafka-lib一起测试Kafka Consumer?

时间:2019-01-31 05:50:31

标签: scala apache-kafka scalatest producer-consumer alpakka

我应该测试我的代码以通过嵌入式“ wi​​thRunningKafka”使用来自kafka服务器的所有消息,如下所示:https://github.com/manub/scalatest-embedded-kafka

  1. 我试图通过创建的嵌入式生产者向该主题发送消息。
  2. 并且我试图通过我在项目中的代码来使用产生的消息(由嵌入式生产者创建)。

“与自定义生产者和消费者进行测试”应该{

"work" in {

    withRunningKafka {

      1. val producer: KafkaProducer[String, String] =
               aKafkaProducer[String](valueSerializer, config)

         val topic = "topic-to-test"

         producer.send(new ProducerRecord[String, String](topic, "some message 1"))
         producer.send(new ProducerRecord[String, String](topic, "some message 2"))
         producer.close()

      2. val ok: Future[Done] = Consumer
        .committableSource(
            consumerSettings,
            Subscriptions.topics(topic))
        .map(msg => println(msg.record.value()))
        .runWith(Sink.ignore)

       ok should be (Done)
    }
}}

问题在这里:“确定”不会将结果显示为“完成”。 一般来说,我测试消费者的逻辑正确吗?

2 个答案:

答案 0 :(得分:1)

欢迎来到stackoverflow!

ok从未以结果完成的原因,因为源正在等待可能的进一步消息。在地图前添加.take(2),在两个元素使ok将来完成时,源将停止。

答案 1 :(得分:0)

我认为您同时面临两个问题:

  1. Kafka用户无限地等待元素(如@dvim所说),因此您需要使用.take()使其真正结束

  2. 默认情况下,kafka使用者组将在当前主题的末尾而不是开始处开始,因此不会消耗在旋转之前发布的消息。您需要进行一些设置,使其开始于主题的开头而不是结尾。