如何在测试中为带@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
相关产品推荐
相关产品推荐

