Clojure 卡夫卡MockConsumer未收到记录
我写的是0.9版本中使用clojure中的java互操作的新kafka消费者API。到目前为止,我已经取得了成功,但现在我正在尝试使用Clojure 卡夫卡MockConsumer未收到记录,clojure,apache-kafka,kafka-consumer-api,Clojure,Apache Kafka,Kafka Consumer Api,我写的是0.9版本中使用clojure中的java互操作的新kafka消费者API。到目前为止,我已经取得了成功,但现在我正在尝试使用MockConsumer和MockProducer编写一些单元测试。我的测试总是失败,因为(第一个值)是nil 我不明白为什么消费者看不到制作人发送给主题的任何消息 (ns blah (:require [cheshire.core :as json] [clojure.test :refer [is testing deftest]]
MockConsumer
和MockProducer
编写一些单元测试。我的测试总是失败,因为(第一个值)
是nil
我不明白为什么消费者看不到制作人发送给主题的任何消息
(ns blah
(:require [cheshire.core :as json]
[clojure.test :refer [is testing deftest]])
(:import [org.apache.kafka.clients.consumer MockConsumer OffsetResetStrategy]
[org.apache.kafka.clients.producer MockProducer]
[org.apache.kafka.common.serialization StringSerializer]
[org.apache.kafka.clients.consumer KafkaConsumer ConsumerRecords ConsumerRecord]
[org.apache.kafka.clients.producer KafkaProducer ProducerRecord]
[java.util ArrayList]))
(defn send-message
[producer topic value]
(let [pr (ProducerRecord. topic value)]
(.send producer pr)))
(defn messages
"Return seq of messages from consumer."
([consumer] (messages consumer 100))
([consumer timeout]
(println "poll consumer for messages")
(let [records (seq (.poll consumer timeout))]
(when records
(map record->map records)))))
(deftest consuming
(let [c (MockConsumer. (OffsetResetStrategy/EARLIEST))
_ (.subscribe c (doto (ArrayList.) (.add "unittest")))
p (MockProducer. true (StringSerializer.) (StringSerializer.))]
(send-message p "unittest" (json/generate-string {:a 1 :b "two"}))
(let [values (seq (messages c))]
(is (= {:a 1 :b "two"}
(first values))))
(.close c)
(.close p)))
有什么想法吗?MockProducer设计用于单元测试类/函数是否正在生成预期的消息。例如:
(deftest producing
(let [p (MockProducer. true (StringSerializer.) (StringSerializer.))]
(send-message p "unittest" (json/generate-string {:a 1 :b "two"}))
(let [values (.history p)]
(is (= {:a 1 :b "two"}
(json/parse-string (.value (first values)) true))))
(.close p)))
注意对
与此类似,MockConsumer也可以为使用者设置测试用例
正如您所看到的,MockConsumer和MockProducer是完全不相关的,设计用于隔离使用
如果您想要测试的是一次完整的往返,那么您可能会更感兴趣的是使用以下内容启动嵌入式卡夫卡