在Spring Cloud Stream中使用Embedded Kafka进行集成测试时,如何立即验证是否已确认消息?

时间:2019-07-01 15:16:08

标签: apache-kafka integration-testing spring-cloud-stream spring-kafka-test embedded-kafka

我们使用Spring Cloud Stream Kafka Binder(与Project Reactor集成,即 Flux streams) 和manual offset commits (即autoCommitOffset = false)。

我们正在尝试使用Embedded Kafka from spring-kafka-test编写集成测试 可以通过使用admin client手动读取使用者组偏移量来断言这一切正常, 测试前后会向我们的主题发送消息。

测试间歇性失败。现在,我们使用awaitility等待最多10秒钟,以轮询偏移量, 这似乎可以解决我们的大多数问题,因为偏移量会在7秒钟后发生变化-但这对于测试而言并不令人满意。

一旦我们通过调用Acknowledgement.acknowledge()手动确认消息接收后,是否有办法确保Spring Cloud Stream Kafka Binder将立即写入偏移量更改?

以不同的方式输入:我们如何验证acknowledge是否在我们的测试中被调用而不必等待?

我们使用Kotlin,Mockito和Mockito-kotlin,因此无法使用PowerMockito。

1 个答案:

答案 0 :(得分:2)

问题是class Child: Parent { constructor(name: String, age: Int): super(name, age) constructor(isAlive: Boolean): super(isAlive) } 不是线程安全的。提交必须在容器线程上完成。如果使用者在确认后坐在Consumer内,则必须等待多达poll()才会提交偏移。

默认pollTimeout为5秒。

您可以添加pollTimeout ListenerContainerCustomizer来修改@Bean