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

Quarkus更新后Mock @Singleton的RecoveryService失败求助

解决Quarkus更新后Mock @Singleton Bean的报错问题

针对你遇到的Quarkus更新后使用@InjectMock配合@MockitoConfig(convertScopes = true)仍无法Mock@Singleton修饰的RecoveryService的问题,提供以下几种可行的解决方法:

方法1:改用@MockBean替代@InjectMock

Quarkus新版本对@InjectMock的作用域转换逻辑做了严格限制,而@MockBean是专门用来替换容器中Bean实例的注解,无需额外配置就能处理@Singleton这类伪作用域:

import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.MockBean;

@QuarkusTest
public class YourTestClass {
    @MockBean
    RecoveryService recoveryService;

    // 编写测试逻辑
}

这个方案是目前最稳定的选择,@MockBean会直接覆盖容器中的RecoveryService单例实例,不会触发作用域校验错误。

方法2:给Mock实例显式添加@Singleton注解

如果坚持使用@InjectMock,可以尝试给Mock对象显式标注@Singleton作用域,配合@MockitoConfig配置:

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.mockito.MockitoConfig;
import jakarta.inject.Singleton;
import org.mockito.Mock;

@QuarkusTest
@MockitoConfig(convertScopes = true)
public class YourTestClass {
    @InjectMock
    @Singleton
    RecoveryService recoveryService;

    // 编写测试逻辑
}

通过显式指定Mock的作用域,让CDI容器识别其作用域类型,绕过“未声明CDI普通作用域”的校验。

方法3:升级Quarkus到最新稳定版

部分旧版本Quarkus在处理伪作用域Bean的Mock时存在已知Bug,升级到最新稳定版(比如3.x系列)可能已经修复了该问题。可以查看对应版本的Release Notes确认相关修复内容。

补充说明:@Singleton属于CDI的伪作用域(pseudo-scope),和@RequestScoped这类普通作用域的处理逻辑不同,新版本Quarkus对@InjectMock的校验更严格,因此优先推荐@MockBean方案。

内容的提问来源于stack exchange,提问作者Денис Анд

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:24:59