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

如何在测试中为带@Context注解的HttpHeaders参数传值?

解决@Context HttpHeaders参数的测试传参问题

针对你遇到的Jakarta EE接口中@Context注解参数的测试传参问题,分两种场景给出解决方案:

1. 集成测试(对应你用@OperateOnDeployment的场景)

因为你使用了Arquillian的部署测试注解,此时应该通过HTTP请求调用接口,而非直接调用Java方法——直接调用的话容器不会自动注入@Context标记的参数。

示例代码:

@Test
@OperateOnDeployment(IT)
public void loginWithoutValidityTest() {
    // 构建HTTP请求,设置所需的请求头和查询参数
    Response response = ClientBuilder.newClient()
            .target("http://localhost:8080/你的应用路径/auth/login") // 替换为实际接口路径
            .queryParam("rememberme", true)
            .header(H_FIRM, "测试企业标识")
            .request()
            .get(); // 根据接口实际方法选择get/post等
    
    assertEquals(200, response.getStatus());
}

这种方式下,容器会自动处理@Context参数的注入,HttpHeaders会包含你设置的所有请求头信息。

2. 单元测试(无需启动容器)

如果是单元测试,需要手动Mock@Context对应的对象(可以用Mockito框架),然后作为参数直接传入方法:

@Test
public void loginWithoutValidityTest() {
    // Mock HttpHeaders和UriInfo实例
    HttpHeaders mockHeaders = Mockito.mock(HttpHeaders.class);
    UriInfo mockUriInfo = Mockito.mock(UriInfo.class);
    
    // 按需设置mockHeaders的预期行为,比如模拟获取某个请求头
    Mockito.when(mockHeaders.getHeaderString("自定义头名称")).thenReturn("头值");
    
    // 直接调用login方法,传入所有参数
    Response response = authResource.login("测试企业标识", true, mockHeaders, mockUriInfo);
    
    assertEquals(200, response.getStatus());
}

这种方式适用于不需要启动完整容器的快速单元测试,手动提供@Context参数的Mock实例即可。

关键提示

@Context注解的参数由Jakarta EE容器负责注入,直接调用Java方法时容器不会自动注入这些参数,所以要么通过HTTP请求触发容器处理,要么手动Mock传入实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:20:09