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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:42:50