Spring Kafka单元测试报错:无法识别TestUtils.createBrokerConfig()方法
KafkaEmbedded初始化失败的问题 我之前也踩过这个坑,这个报错本质是spring-kafka-test 2.1.5.RELEASE和它依赖的Kafka客户端版本不匹配导致的。
问题根源
KafkaEmbedded内部会通过反射调用Kafka官方的TestUtils.createBrokerConfig()方法,但在某些Kafka版本里,这个方法的签名发生了变化,而2.1.5版本的spring-kafka-test没适配对应的Kafka版本,反射找方法的时候就失败了,直接抛出Failed to determine TestUtils.createBrokerConfig() method这个异常。
可行的解决方案
统一Spring Kafka与Kafka客户端版本
spring-kafka 2.1.x系列对应的Kafka客户端版本应该是1.1.x(别用2.x版本,会不兼容)。你可以在Maven的pom.xml里明确指定版本,避免依赖自动引入的不兼容版本:<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <version>2.1.5.RELEASE</version> <scope>test</scope> </dependency>升级spring-kafka-test版本
如果项目允许的话,建议直接升级到2.1.x系列的最新稳定版(比如2.1.14.RELEASE),或者更高的大版本(比如2.8.x),这些后续版本已经修复了这类版本兼容的问题,升级后再跑测试应该就能正常工作了。排查并解决依赖冲突
先用Maven命令查看依赖树,找出有没有其他依赖偷偷引入了不兼容的Kafka版本:mvn dependency:tree | grep kafka如果发现冲突,就在对应的依赖里添加排除规则,把不兼容的Kafka客户端依赖排除掉:
<dependency> <groupId>你的依赖groupId</groupId> <artifactId>你的依赖artifactId</artifactId> <exclusions> <exclusion> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> </exclusion> </exclusions> </dependency>
小提示
官方文档的示例一般是基于最新稳定版写的,如果你用的是旧版本,很容易碰到这种版本不兼容的问题。建议尽量使用和官方文档匹配的版本,或者去查对应版本的官方文档(比如2.1.5.RELEASE的Spring Kafka文档)来写测试代码,这样能少踩很多坑。
内容的提问来源于stack exchange,提问作者Jorge Bonafé

