Spring Boot多模块下Kafka监听器测试失败求助
多模块Spring Boot中Kafka监听器测试失败的排查与解决
以下是针对你在子模块中Kafka监听器测试无法接收消息问题的具体排查点和解决方案:
1. 修复组件扫描范围问题
根模块的@SpringBootTest默认扫描根包com.example.demotestcontainers,但子模块的监听器位于com.example.demotestcontainers.module,大概率未被Spring上下文扫描到。
解决方案:
- 修改子模块的测试配置类,添加组件扫描注解指定子模块包:
package com.example.demotestcontainers.module import org.springframework.boot.SpringBootConfiguration import org.springframework.boot.autoconfigure.EnableAutoConfiguration import org.springframework.context.annotation.ComponentScan @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(basePackages = ["com.example.demotestcontainers.module"]) class ModuleTestConfiguration
- 同时在子模块测试类中,通过
@SpringBootTest的classes属性指定该配置类:
@SpringBootTest( properties = [ "spring.kafka.consumer.auto-offset-reset=earliest", "consumer.topic.name=test-topic" // 确保与发送的topic一致 ], classes = [ModuleTestConfiguration::class] )
2. 确保Kafka配置完全一致
- 检查子模块监听器的topic配置:你使用了
${consumer.topic.name}占位符,测试时发送的是test-topic,必须在测试的properties中显式配置该值(如上面代码所示),否则监听器监听的topic与发送的topic不匹配,无法接收消息。 - 确认groupId未冲突:子模块监听器的groupId如果与其他消费者重复,可能导致消费组协调异常,可临时修改groupId为
demo-module测试。
3. 修正MockBean/SpyBean的错误使用
你在根模块测试中同时给useCase添加了@SpyBean和@MockBean注解,这是错误的(二者只能选其一),会导致Spring上下文创建Bean混乱。子模块测试中必须修正:
// 若需要验证真实方法调用,使用@SpyBean @SpyBean private lateinit var useCase: UseCase // 若只需要Mock方法行为,使用@MockBean // @MockBean // private lateinit var useCase: UseCase
4. 确保Testcontainers配置正确
子模块测试类必须独立配置KafkaContainer的动态属性,和根模块一致:
@Testcontainers @SpringBootTest(...) class ModuleKafkaListenerTest { companion object { @Container private val kafkaContainer = KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.3.3")) @JvmStatic @DynamicPropertySource fun overrideProperties(registry: DynamicPropertyRegistry) { registry.add("spring.kafka.bootstrap-servers", kafkaContainer::getBootstrapServers) } } // 测试代码... }
5. 验证监听器是否被加载
可以在测试中添加验证逻辑,确认Spring上下文是否正确加载了子模块的Kafka监听器:
@Autowired private lateinit var applicationContext: ApplicationContext @Test fun `verify listener is registered`() { val listenerBeans = applicationContext.getBeansOfType(com.example.demotestcontainers.module.KafkaListener::class.java) assert(listenerBeans.isNotEmpty()) { "Kafka监听器未被Spring上下文加载" } }
内容的提问来源于stack exchange,提问作者Mauricio Avendaño
相关产品推荐
相关产品推荐

