用途:为 Kafka 集成测试提供方案选型与示例,覆盖 Java/Spring、Node.js、Python。
方案选型:@EmbeddedKafka(约2秒启动,真实进程内 broker,适合 Spring Boot 单元/集成测试);MockConsumer/MockProducer(即时,无 broker,适合隔离单元测试);Testcontainers KafkaContainer(约10秒启动,真实 Docker broker,适合完整集成测试与 CI)。默认 Spring 测试用 @EmbeddedKafka;需要特定 Kafka 版本、多 broker 集群或非 Spring 项目时用 Testcontainers;仅在隔离单测中用 Mock。
Java/Spring:引入 org.springframework.kafka:spring-kafka-test(test 作用域),用 @EmbeddedKafka(partitions, topics) 配合 KafkaTestUtils.consumerProps/producerProps 与 getSingleRecord 收发消息;消费端可用 @SpyBean 加 CountDownLatch 等待;发送前用 ContainerTestUtils.waitForAssignment 等待分区分配。MockProducer/MockConsumer 可直接断言 history 或注入记录。Testcontainers 可用 @ServiceConnection(Spring Boot 3.1+)或 @DynamicPropertySource 注入 bootstrap-servers,依赖 org.testcontainers:kafka。
Node.js:kafkajs 搭配 @testcontainers/kafka,在 beforeAll 启动容器、afterAll 停止,用 admin 建 topic,producer/consumer 收发后断言。Python:confluent-kafka 搭配 testcontainers.kafka 的 KafkaContainer,pytest fixture 提供 bootstrap servers,生产后 poll 校验消息。
限制与注意:消费者未等分区分配会漏消息;超时过短易致测试不稳定,用 await().atMost() 或宽松超时;避免测试间共享 topic 名;测试后必须关闭消费者;测试消费者用 earliest 而非 latest。常见问题包括 EmbeddedKafka 端口冲突(用 @DirtiesContext 或 EmbeddedKafkaHolder)、反序列化错误(配置 trusted.packages)、Testcontainers 超时(检查 Docker)等。具体版本、依赖坐标与命令见官方文档,本资料未提供更多细节。