如何获取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
相关产品推荐
相关产品推荐

