我应该测试我的代码以通过嵌入式“ withRunningKafka”使用来自kafka服务器的所有消息,如下所示:https://github.com/manub/scalatest-embedded-kafka
“与自定义生产者和消费者进行测试”应该{
"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)
}
}}
问题在这里:“确定”不会将结果显示为“完成”。 一般来说,我测试消费者的逻辑正确吗?
答案 0 :(得分:1)
欢迎来到stackoverflow!
ok
从未以结果完成的原因,因为源正在等待可能的进一步消息。在地图前添加.take(2)
,在两个元素使ok
将来完成时,源将停止。
答案 1 :(得分:0)
我认为您同时面临两个问题:
Kafka用户无限地等待元素(如@dvim所说),因此您需要使用.take()使其真正结束
默认情况下,kafka使用者组将在当前主题的末尾而不是开始处开始,因此不会消耗在旋转之前发布的消息。您需要进行一些设置,使其开始于主题的开头而不是结尾。