运行含Reactive Messaging的Quarkus测试时遇No CDI container异常
Quarkus AMQP 测试异常:无CDI容器且消费方法未触发
问题详情
- 项目场景:基于quarkus-messaging-amqp搭建极简项目,包含:
- 标注
@Incoming("executor-in")的消费者方法,用于接收并记录Executor对象 - 自定义
MessageConverter实现类,负责将JSON字符串转换为Executor对象
- 标注
- 测试问题:在IntelliJ中运行JUnit 5测试,发送序列化后的
Executor对象时:- 抛出
java.lang.IllegalStateException: No CDI container is available异常 - 测试可执行,但消费者方法从未被调用
- 抛出
- 对比现象:若
MessageConverter不做JSON转换,直接转发携带JSON负载的Message<?>,同时将消费方法参数改为String,则测试完全正常
解决方案
1. 确保自定义MessageConverter被CDI托管
自定义转换器类必须添加CDI作用域注解(如@ApplicationScoped),让Quarkus容器能识别并管理它,否则测试环境无法获取容器上下文:
@ApplicationScoped public class ExecutorMessageConverter implements MessageConverter { // 实现JSON转Executor的逻辑 }
2. 为测试类添加Quarkus测试注解
测试类需要标注@QuarkusTest,该注解会启动Quarkus的CDI容器及运行时环境,为消息组件提供必要的上下文支持:
@QuarkusTest public class AmqpMessagingTest { // 测试代码 }
3. 检查转换器的依赖注入
如果MessageConverter中用到了其他CDI bean(比如ObjectMapper),必须通过CDI注入获取,避免手动实例化依赖类,确保测试环境中依赖能正常被容器提供。
4. 验证消息的Content-Type头
发送测试消息时,需将content-type头设置为application/json,确保Quarkus消息框架能正确触发自定义转换器进行类型转换。
内容的提问来源于stack exchange,提问作者joe_specimen
相关产品推荐
相关产品推荐

