【问题标题】:Spring Boot and Kafka upgrade broke my testsSpring Boot 和 Kafka 升级打破了我的测试
【发布时间】:2020-12-04 03:42:53
【问题描述】:

我已经更新了一个项目的库,特别是我已经将 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 spring-boot kotlin spring-kafka spring-kafka-test


    【解决方案1】:

    根据 Spring Kafka 库的 test documentation,从 2.5 版开始,他们改变了配置消费者的方式。这是准确的报价:

    从 2.5 版开始,consumerProps 方法将ConsumerConfig.AUTO_OFFSET_RESET_CONFIG 设置为earliest。这是因为,在大多数情况下,您希望消费者使用在测试用例中发送的任何消息。 ConsumerConfig 默认为latest,这意味着在消费者开始之前,测试已经发送的消息将不会收到这些记录。要恢复到以前的行为,请在调用该方法后将属性设置为 latest

    这很可能是所描述的测试错误的原因。

    【讨论】:

    • 不错!我很高兴听到这个答案很有帮助。
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2020-12-03
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多