我有一个带有
MessageListenerContainer
bean 的 Spring Boot 应用程序,我想对其进行单元测试。如何使用模拟 Kafka 消费者来模拟接收多条记录?我搜索并找到了 MockConsumer
以及使用普通 Apache Kafka 的示例,但我不知道如何将它与 Spring Kafka 的 MessageListenerContainer
一起使用。
我使用 Kotlin 和 Kotest,但也欢迎使用 Java/JUnit 的答案。我的单元测试不使用
@SpringBootTest
:相反,我在单元测试中手动创建 beans 和依赖项。
至少有几种方法可以在 Spring Boot 中对处理来自 Kafka 的消息进行单元测试。在我看来,最好的选择是专注于单元测试中的业务行为测试,通过集成测试检查应用程序配置,并将内部 Spring 组件的测试留给 Spring 团队。考虑到这一点,您应该专注于测试类实现
MessageListener<K, V>
(或像 AcknowledgingMessageListener<K, V>
这样的子类之一),而不是使用 ConcurrentKafkaListenerContainerFactory
测试 MockConsumer
,例如:
@Test
void testMyMessageListener() {
SomeCollaborator someCollaborator = Mockito.mock(SomeCollaborator.class);
MessageListener<String, String> myMessageListener = new MyMessageListener(someCollaborator);
ConsumerRecord<String, String> consumerRecord = new ConsumerRecord<>("some-topic", 0, 0, "key", "some value");
myMessageListener.onMessage(consumerRecord);
Mockito.verify(someCollaborator, Mockito.times(1)).someMethod();
}