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

