Clojure 卡夫卡MockConsumer未收到记录

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]]

我写的是0.9版本中使用clojure中的java互操作的新kafka消费者API。到目前为止,我已经取得了成功,但现在我正在尝试使用
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是完全不相关的,设计用于隔离使用

如果您想要测试的是一次完整的往返,那么您可能会更感兴趣的是使用以下内容启动嵌入式卡夫卡