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
相关产品推荐
相关产品推荐

