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

Quarkus测试中懒加载ApplicationScoped Bean仅父Bean可用的解决方法

解决Quarkus原生测试中直接使用@ApplicationScoped Bean的配置加载问题

问题根源

你手动通过构造函数实例化Client时,Quarkus的CDI容器依然会识别这个类上的@ApplicationScoped和@ConfigProperty注解,尝试从配置中加载FOO和BAR的值——但你并没有在测试环境提供这些配置,所以抛出加载失败的异常。而UseCases测试能运行,是因为你手动传入了自己创建的Client实例,CDI没有去初始化Client的代理或尝试注入配置。

解决方案

方案1:为测试环境提供配置(推荐)

在src/test/resources目录下创建application.properties,添加测试用的配置值:

FOO=foo
BAR=bar

测试中直接通过CDI注入Bean,无需手动实例化:

@Inject
lateinit var client: Client

@Inject
lateinit var useCases: UseCases

这种方式符合Quarkus测试的最佳实践,原生测试也能完美支持。

方案2:创建测试专用的替代Bean

在测试包下创建一个测试专用的Client Bean,用@Alternative和@Priority让Quarkus在测试时优先使用它:

@ApplicationScoped
@Alternative
@Priority(1)
class TestClient : Client("foo", "bar")

测试中直接注入Client和UseCases即可,CDI会自动使用TestClient实例,无需手动构造。

方案3:手动实例化时避开CDI管理

如果一定要手动实例化,可以创建一个不带@ApplicationScoped注解的子类,避免CDI处理配置注入:

// 测试包下的子类
class TestClient(foo: String, bar: String) : Client(foo, bar)

然后在测试中实例化这个子类:

val client by lazy {
    TestClient("foo", "bar")
}
val useCases by lazy {
    UseCases(client)
}

这种方式绕开了CDI对原Client类的注解处理,不会触发配置加载逻辑。

内容的提问来源于stack exchange,提问作者LeadingMoominExpert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:05:17