我想我对TopologyTestDriver误解了。
直到现在,当我开发Kafka Stream应用程序时,我在测试环境中连接到真正的Kafka,手动创建并填充了主题,并检查主题外的内容。
为了使测试自动化,我查看了TopologyTestDriver
。根据Confluent(https://docs.confluent.io/current/streams/developer-guide/test-streams.html)发布的文档,这似乎是我想要的:
[...]通常,您使用KafkaStreams类运行拓扑,该类 连接到您的经纪人[...]。 为了进行测试,运行代理会增加很多复杂性和时间。
Streams为KafkaStreams类提供了TopologyTestDriver替代品。它没有外部系统依赖性[...] 钩子,用于验证发送到输出主题的数据[...]。
我关心的是拓扑的位置。在我看到的每个示例中(在Confluent上,在Kafka网站上,...),拓扑是在测试文件中定义的:
private TopologyTestDriver testDriver;
....
@Before
public void setup() {
Topology topology = new Topology();
topology.addSource("sourceProcessor", "input-topic");
.......
// setup test driver
Properties config = new Properties();
....
testDriver = new TopologyTestDriver(topology, config);
// pre-populate store
.....
}
@After
public void tearDown() {
testDriver.close();
}
@Test
public void shouldFlushStoreForFirstInput() {
testDriver.pipeInput(recordFactory.create("input-topic", "a", 1L, 9999L));
OutputVerifier.compareKeyValue(......);
Assert.assertNull(........);
}
如何为现有的Kafka Streams应用实施测试?我无法想象必须复制拓扑代码-主文件中的一个版本和测试文件中的一个版本。很难维护。
我现有的应用程序具有直接在main
方法中定义的拓扑。我可以通过添加诸如protected static org.apache.kafka.streams.Topology buildTopology() {...}
之类的静态方法从主体中提取拓扑设计,并且可以从测试文件中调用此方法。
但是,还有没有更干净的解决方案来执行测试代码中的主代码?