如何在Google Cloud Function单元测试中Mock请求参数?
解决方案
核心思路
你要测试JSON请求体中name字段的读取逻辑,只需要在对应测试用例中重写HttpRequest的getReader()方法的Mock返回值,让它返回携带name参数的JSON字符串流即可。原有@BeforeEach中默认返回空内容的Reader,仅匹配无请求体的GET请求场景。
新增测试用例
在HelloHttpTest类中添加如下测试方法,即可覆盖你要验证的name = requestJson.get("name").getAsString();逻辑:
@Test public void helloHttp_postWithNameInJson() throws IOException { // 构造携带name参数的JSON请求体 String jsonBody = "{\"name\": \"GCP测试用户\"}"; // 覆盖默认的Mock规则,返回带JSON内容的BufferedReader when(request.getReader()).thenReturn(new BufferedReader(new StringReader(jsonBody))); // 执行云函数逻辑 new HelloHttp().service(request, response); writerOut.flush(); // 验证返回结果符合预期 Assertions.assertEquals("Hello GCP测试用户!", responseOut.toString()); }
如果需要验证「查询参数和JSON同时携带name时,JSON的name会覆盖查询参数」的逻辑,可以再加如下用例:
// 注意需要导入Optional包:import java.util.Optional; @Test public void helloHttp_jsonNameOverrideQueryParam() throws IOException { // Mock查询参数中的name when(request.getFirstQueryParameter("name")).thenReturn(Optional.of("查询参数值")); // Mock JSON请求体中的name String jsonBody = "{\"name\": \"JSON参数值\"}"; when(request.getReader()).thenReturn(new BufferedReader(new StringReader(jsonBody))); new HelloHttp().service(request, response); writerOut.flush(); // 你的函数逻辑中JSON的name优先级更高,所以预期取JSON的值 Assertions.assertEquals("Hello JSON参数值!", responseOut.toString()); }
可扩展的测试场景
你还可以根据需要补充其他边界场景的测试:
- JSON格式非法的场景:构造格式错误的JSON字符串,验证函数不会抛出异常,正常返回默认值/查询参数对应的值
- 请求体为非JSON格式的场景:比如纯文本内容,验证逻辑正常降级
- JSON中不带name字段的场景:验证不会抛出空指针,取查询参数/默认值
内容的提问来源于stack exchange,提问作者Hola
相关产品推荐
相关产品推荐

