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,提问作者Денис Анд
相关产品推荐
相关产品推荐

