You need to enable JavaScript to run this app. 如何获取REST Assured的依赖注入上下文以访问被测Quarkus应用的Bean?
优惠活动
大模型
产品
解决方案
定价
更多

如何获取REST Assured的依赖注入上下文以访问被测Quarkus应用的Bean?

问题本质

REST Assured 本身不具备创建DI上下文的能力,你观察到的上下文隔离,是因为测试流程没有绑定Quarkus测试扩展的统一容器管理逻辑——测试侧的CDI容器和被测应用运行的CDI容器是两个完全独立的实例,哪怕注入完全相同类型的Bean,也是各自内存空间里的独立对象,自然不会同步属性变更。

实现跨上下文访问被测应用Bean的方案

1. 接入Quarkus测试扩展打通统一上下文

  • 所有集成测试类必须添加@QuarkusTest注解,该注解会在测试运行的JVM内启动和生产环境配置完全一致的Quarkus运行容器,测试逻辑、HTTP请求处理逻辑全部运行在同一个容器实例中
  • 这种模式下,测试类本身就是CDI容器的托管Bean,通过@Inject注入的Bean,和应用处理REST请求时从容器获取的Bean是完全相同的实例,你对注入Bean做的任何属性修改,都会直接被应用侧的请求处理逻辑感知
  • Quarkus扩展会自动适配REST Assured的基础配置(比如测试端口、基础路径),REST Assured此时仅作为纯HTTP请求客户端存在,不会引入独立的运行上下文

2. 关键避坑规则

  • 不要脱离@QuarkusTest环境,单独启动独立进程的Quarkus应用,再用REST Assured打远程服务端口——这种场景下测试和应用分属两个独立进程,物理上不存在共享同一Bean实例的可能
  • 不要在测试类中混用其他框架的测试DI配置(比如Spring Test注解、手动启动裸CDI SE容器的逻辑),否则会重新拉起独立的类加载器和CDI容器,再次触发上下文隔离问题
  • 如果测试过程需要替换Bean的实现逻辑(比如模拟外部依赖),不要手动修改已注入Bean的属性,优先使用Quarkus提供的@TestProfile + 高优先级@Alternative声明替代Bean——这种方式的Bean替换会直接作用到整个容器的Bean解析逻辑,不存在同步延迟或隔离问题
适配后的正确示例代码
@QuarkusTest
public class SupportedCheckApiTest {
    // 注入的Bean与应用运行时的Bean为同一实例
    @Inject
    MyClass myBean;

    @Test
    public void testSupportedCheckApi() {
        // 修改Bean属性,变更会直接同步到应用的请求处理逻辑中
        myBean.setMockModeEnabled(true);

        ExtractableResponse<Response> extract = given()
                .contentType(ContentType.JSON)
                .header("Authorization", "Bearer " + token)
                .body(request)
                .post(API_SUPPORTED_CHECK)
                .then()
                .statusCode(200)
                .extract();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 14:36:00