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

Lambda中含AwsProxyRequestContext的Micronaut控制器JUnit集成测试问题

问题分析

你的控制器方法依赖AwsProxyRequestContext参数,这个参数是Micronaut从Lambda的AwsProxyRequest请求上下文绑定而来的。Postman测试正常是因为请求经过Lambda代理时,AWS自动填充了完整的请求上下文数据;而JUnit测试中,默认的HttpRequest没有携带Lambda上下文信息,导致Micronaut无法完成参数绑定,触发Bad Request错误。

解决方案

要让测试正常运行,你需要在测试请求中手动注入AwsProxyRequestContext对象,Micronaut会自动将其绑定到控制器的参数上。以下是两种常用实现方式:

方式1:使用Lambda请求处理器构造完整请求

如果你的项目引入了micronaut-aws-lambda-test依赖,可以直接通过LambdaRequestHandler构造带上下文的Lambda请求:

@MicronautTest
public class YourControllerTest {

    @Inject
    private LambdaRequestHandler<AwsProxyRequest, AwsProxyResponse> lambdaHandler;

    @Test
    void testEndpointWithContext() {
        // 构造带Bearer令牌和Lambda上下文的请求
        AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder()
                .path("/your-api-endpoint")
                .httpMethod(HttpMethod.POST)
                .header("Authorization", "Bearer your-test-token")
                // 填充必要的上下文字段(至少保证非空,可根据实际需求补充)
                .requestContext(new RequestContext()
                        .withIdentity(new Identity()
                                .withUserArn("test-user-arn")
                                .withApiKey("test-api-key")))
                .build();

        // 发送请求并验证结果
        AwsProxyResponse response = lambdaHandler.handleRequest(proxyRequest, null);
        assertEquals(200, response.getStatusCode());
    }
}

方式2:通过TestHttpClient添加上下文属性

如果使用普通的TestHttpClient,可以在请求属性中直接注入AwsProxyRequestContext对象:

@MicronautTest
public class YourControllerTest {

    @Inject
    @Client("/")
    HttpClient httpClient;

    @Test
    void testEndpointWithContext() {
        // 创建带Bearer令牌的请求,并添加Lambda上下文属性
        HttpRequest<?> request = HttpRequest.POST("/your-api-endpoint", "{\"data\":\"test\"}")
                .header("Authorization", "Bearer your-test-token")
                .header("Content-Type", "application/json")
                // 绑定Lambda请求上下文到请求属性中
                .attribute(AwsLambdaUtils.LAMBDA_REQUEST_CONTEXT_ATTRIBUTE, new AwsProxyRequestContext());

        // 发送请求并验证结果
        HttpResponse<String> response = httpClient.toBlocking().exchange(request, String.class);
        assertEquals(HttpStatus.OK, response.status());
    }
}
关键说明
  • 不需要填充AwsProxyRequestContext的所有字段,只要保证对象非空即可满足参数绑定要求;如果你的业务逻辑依赖上下文里的特定字段(比如用户ARN、API密钥),再按需填充对应值。
  • 确保测试依赖中包含io.micronaut.aws:micronaut-aws-lambda-test(如果使用方式1),或者核心的Micronaut AWS依赖(方式2)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:35:20