【发布时间】:2020-05-19 14:24:08
【问题描述】:
目前,我有一个基本的 Kafka 流应用程序,它涉及一个只有源和处理器但没有接收器的拓扑。本质上,Topology 只处理消息的消费。至于产生消息,我们在传递给拓扑的 ProcessorSupplier 实例中调用 Producer API,特别是在重写的 process 方法中。虽然我知道 Producer API 在这里是多余的,因为我可以简单地在拓扑中添加一个接收器,但我处于必须以这种方式设置我的流应用程序的位置。至于测试,我试用了kafka-streams-test-utils 包中的TopologyTestDriver 类。但是,我不仅要测试拓扑,还要测试对 Producer API 的调用。使用TopologyTestDriver 需要我模拟我的Producer 实例,因为它与Streams API 是分开的。结果,由于消息没有“转发”,我无法读取来自TopologyTestDriver 的消息以进行单元测试。
这是我的process 方法的简化版本:
@Override
public void process(String key, String value) {
// some data processing stuff that I leave out for simplicity sake
String topic = "...";
Properties props = ...;
//Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord(topic, key, value);
producer.send(record);
}
这是我的示例单元测试的简化:
@Test
public void process() {
Topology topology = new Topology();
topology.addSource("source", "input-topic");
topology.addProcessor("processor", ..., "source");
Properties props = ...;
TopologyTestDriver testDriver = new TopologyTestDriver(topology, props);
ConsumerRecordFactory<String, String> factory = new ConsumerRecordFactory<>(new StringSerializer(), new StringSerializer());
// the following line will work fine as long as the producer is mocked
testDriver.pipeInput(factory.create("input-topic", "key", "value"));
// since the producer is mocked, no message can be read from the output topic
ProducerRecord<String, String> outputRecord = testDriver.readOutput("output-topic", new StringDeserializer(), new StringDeserializer());
assertNull(outputRecord); // returns true
}
总结一下我的问题,有没有办法编写一个单元测试来测试拓扑中消息的消费和生产,该拓扑使用生产者 API 将消息写入传出主题?
【问题讨论】:
-
Spring 有一个嵌入式 Kafka,可用作执行此操作的基础架构。
标签: java junit apache-kafka apache-kafka-streams kafka-producer-api