问题描述
我已经更新了一个项目的库,尤其是将Spring Boot从2.2.6版本更新到了2.3.2。
如the migration documentation中所述,这也意味着我的Kafka依赖项发生了变化,一直到Spring Kafka和Kafka 2.5
但是,由于此更改,我的某些测试“随机地”失败,例如,当我执行所有测试时,我在其中的某些测试中遇到了这种失败(但并非总是在同一测试中):
java.lang.IllegalStateException: More than one record for topic found
来自此特定行:
KafkaTestUtils.getSingleRecord(consumer,topicConfiguration.getTopic(event))
文档中没有提及发生这种情况的原因,也没有其他日志错误消息说明发生这种情况的原因。因为我没有更改应用程序的逻辑,所以迁移过程中我缺少什么了吗?
如果我尝试这样的事情:
KafkaTestUtils.getRecords(consumer)
.records(topicConfiguration.getTopic(event)).map { it }[0]
要仅获取第一个,由于索引,先前可用的测试将失败,并显示IndexOutOfBoundsException
。
解决方法
根据Spring Kafka库的test documentation,从版本2.5开始,他们更改了配置使用者的方式。这是确切的报价:
从版本2.5开始,
consumerProps
方法将ConsumerConfig.AUTO_OFFSET_RESET_CONFIG
设置为earliest
。这是因为,在大多数情况下,您希望使用者使用测试用例中发送的所有消息。ConsumerConfig
的默认值为latest
,这意味着在使用者使用之前,测试已经发送的消息将不会接收这些记录。若要还原为以前的行为,请在调用方法后将属性设置为latest
。
很有可能是所描述的测试错误的原因。