如何在Quarkus控制器的单元测试中验证请求头参数值?
Quarkus控制器X-API-Key请求头校验的单元测试编写
一、直接单元测试(Mock HttpHeaders)
这种方式针对控制器方法本身,通过Mock HttpHeaders对象模拟不同请求头场景,适合快速验证校验逻辑。
依赖准备
确保测试依赖包含JUnit 5、Mockito及Quarkus测试支持:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency>
测试代码示例
import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @QuarkusTest class ABCControllerTest { private final ABCController controller = new ABCController(); @Test void createABC_shouldThrowForbiddenException_whenXApiKeyMissing() { // Mock HttpHeaders,模拟请求头无X-API-Key的场景 HttpHeaders mockHeaders = Mockito.mock(HttpHeaders.class); Mockito.when(mockHeaders.getRequestHeader("X-API-Key")).thenReturn(null); // 执行方法并验证异常 RestFulPayoutException exception = assertThrows(RestFulPayoutException.class, () -> { controller.createABC(mockHeaders, new AbcRequest()).await().indefinitely(); }); assertEquals("X-API-Key is missing on headers", exception.getMessage()); assertEquals(Response.Status.FORBIDDEN, exception.getStatus()); } @Test void createABC_shouldThrowForbiddenException_whenXApiKeyIsBlank() { // Mock HttpHeaders,模拟X-API-Key为空字符串的场景 HttpHeaders mockHeaders = Mockito.mock(HttpHeaders.class); Mockito.when(mockHeaders.getRequestHeader("X-API-Key")).thenReturn(List.of("")); RestFulPayoutException exception = assertThrows(RestFulPayoutException.class, () -> { controller.createABC(mockHeaders, new AbcRequest()).await().indefinitely(); }); assertEquals("X-API-Key is missing on headers", exception.getMessage()); assertEquals(Response.Status.FORBIDDEN, exception.getStatus()); } @Test void createABC_shouldNotThrowException_whenXApiKeyIsValid() { // Mock HttpHeaders,模拟合法X-API-Key的场景 HttpHeaders mockHeaders = Mockito.mock(HttpHeaders.class); Mockito.when(mockHeaders.getRequestHeader("X-API-Key")).thenReturn(List.of("valid-api-key-123")); // 执行方法,验证无异常抛出(假设后续逻辑正常) assertDoesNotThrow(() -> { controller.createABC(mockHeaders, new AbcRequest()).await().indefinitely(); }); } }
二、REST集成测试(基于RESTAssured)
这种方式模拟真实HTTP请求,更贴近实际运行场景,适合验证完整请求处理流程。
测试代码示例
import io.quarkus.test.junit.QuarkusTest; import io.restassured.RestAssured; import org.junit.jupiter.api.Test; import static org.hamcrest.Matchers.equalTo; @QuarkusTest class ABCControllerIntegrationTest { @Test void createABC_shouldReturnForbidden_whenXApiKeyMissing() { RestAssured.given() .contentType("application/json") .body(new AbcRequest()) // 构造合法请求体 .when() .post("/abcs") .then() .statusCode(403) .body("message", equalTo("X-API-Key is missing on headers")); } @Test void createABC_shouldReturnForbidden_whenXApiKeyIsBlank() { RestAssured.given() .header("X-API-Key", "") .contentType("application/json") .body(new AbcRequest()) .when() .post("/abcs") .then() .statusCode(403) .body("message", equalTo("X-API-Key is missing on headers")); } @Test void createABC_shouldReturnCreated_whenXApiKeyIsValid() { RestAssured.given() .header("X-API-Key", "valid-api-key-123") .contentType("application/json") .body(new AbcRequest()) // 构造合法请求体 .when() .post("/abcs") .then() .statusCode(201); } }
注意事项
- 若
RestFulPayoutException为自定义异常,需确保Quarkus已配置异常映射器(ExceptionMapper),将其转换为对应HTTP响应,否则集成测试可能无法正确捕获响应体信息。 - 测试
Uni类型返回值时,需用await().indefinitely()或await().atMost(Duration.ofSeconds(5))阻塞获取结果,避免测试在异步逻辑完成前结束。
内容的提问来源于stack exchange,提问作者Ramgau
相关产品推荐
相关产品推荐

