You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中如何Mock Emitter?注入时遇依赖未解析异常求方案

解决@InjectMock注入Emitter时的依赖未满足问题

常见修复方案

  • 使用对应框架的测试注解初始化CDI上下文
    若基于Quarkus开发,需在测试类上标注@QuarkusTest或@QuarkusTestProfile;若是OpenLiberty等其他MicroProfile实现,要使用框架提供的测试注解,确保CDI容器能正确加载测试环境。

  • 改用Mockito手动创建模拟实例
    Emitter作为MicroProfile Reactive Messaging接口,直接用@InjectMock无法被CDI容器识别。可以通过Mockito手动创建模拟对象,再注入到被测类:

    @ExtendWith(MockitoExtension.class)
    class ProducerTest {
        @Mock
        private Emitter<String> mockEmitter;
    
        @InjectMocks
        private MyProducer producer;
    
        @Test
        void testProduceMessage() {
            producer.send("test");
            verify(mockEmitter).send(anyString());
        }
    }
    
  • 匹配Emitter的泛型类型
    确保测试中注入的Emitter泛型与被测类依赖的泛型完全一致,比如被测类依赖Emitter<MyEvent>,测试时就不能用Emitter<String>,否则CDI容器会因类型不匹配无法解析。

  • 补充测试依赖库
    确认测试依赖中包含对应消息组件的测试库,比如Quarkus环境下的quarkus-reactive-messaging-amqp-test或quarkus-reactive-messaging-kafka-test,这类依赖会提供测试所需的CDI支持类。

  • 自定义测试用Emitter实现
    若无需复杂模拟,可创建简单的Emitter实现类,通过@Produces注入测试上下文:

    public class TestEmitter<T> implements Emitter<T> {
        private final List<T> sentMessages = new ArrayList<>();
    
        @Override
        public void send(T msg) {
            sentMessages.add(msg);
        }
    
        // 实现其他必要方法(如send(Publisher)、complete()等)
        public List<T> getSentMessages() {
            return sentMessages;
        }
    }
    

    测试类中提供该实例:

    @QuarkusTest
    class ProducerTest {
        @Produces
        Emitter<MyEvent> testEmitter = new TestEmitter<>();
    
        @Inject
        private MyProducer producer;
    
        @Test
        void testProduce() {
            producer.sendEvent(new MyEvent());
            TestEmitter<MyEvent> emitter = (TestEmitter<MyEvent>) testEmitter;
            assertEquals(1, emitter.getSentMessages().size());
        }
    }
    

内容的提问来源于stack exchange,提问作者Dimas Adriyanto Setyawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:37:37