EmbeddedSingleNodeKafkaCluster在junit测试之间延续主题

时间:2018-07-20 20:32:17

标签: java unit-testing junit apache-kafka

我在我的junit测试中使用EmbeddedSingleNodeKafkaCluster(code-v4.1.1)和相关类。在我引入一个单元测试来测试消息的前向兼容性并期望它失败之前(因为它缺少一个名为correlationId的字段),它一直可以正常工作:

 org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition event_source.invoices-0 at offset 0. If needed, please seek past the record to continue consumption.
 Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id 1
 Caused by: org.apache.avro.AvroTypeException: Found com.q2c.schema.avro.invoice.InvoiceEvents, expecting com.q2c.schema.avro.invoice.InvoiceEvents, missing required field correlationId
 at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292)
 at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)

此单元测试总是成功的,并且一切都如预期。.但是下一个单元测试(第二个)“有时”失败了!当执行第二个单元测试时(每个方法后面都有脏上下文,并且可以看到对于第一个测试/代理正确调用了EmbeddedSingleNodeKafkaCluster.stop()),将创建一个新的Kafka代理,但是以下代码:

 kafka = TestUtils.createServer(kafkaConfig, Time.SYSTEM); // line 77

还包括上一个单元测试创​​建的3个主题(event_source.invoices-0)中的1个!结果是第二个单元测试将失败,因为代理将无法创建event_source.invoices-0(它已经存在)。

调试之后,我注意到第一个单元测试的代理(每个代理都有其单独的tmp目录)仍然具有主题event_source.invoices-0的文件夹,并且在00000000000000000000.timeindex中只有一个文件。在stop()删除时,由于某些进程正在使用该文件,因此无法删除该文件。但是删除是在代理停止后发生的。什么可能会锁定文件?

此外,正如我提到的,每个单元测试的代理都有自己的tmp目录。我不明白为什么第二个单元测试中的TestUtils.createServer()也创建主题event_source.invoices主题?

任何帮助和想法都非常受欢迎!

在Windows和Linux中都会发生。

<kafka-version>1.0.1</kafka-version>
<kafka-streams-version>1.0.1</kafka-streams-version>

致谢!

0 个答案:

没有答案