如何在Spring MVC POST控制器测试中使用ObjectMapper处理多参数
多参数POST Spring MVC控制器的MockMvc测试实现
首先明确示例中两个控制器参数的绑定逻辑:两类参数绑定的HTTP请求位置完全独立,不存在需要把两个参数都用ObjectMapper序列化拼到一起的情况:
@RequestBody String requestBody:绑定HTTP请求的请求体内容,这部分才是需要用ObjectMapper序列化后传入的对象@RequestParam("obfuscated") boolean obfuscated:绑定请求的查询参数(URL后缀的键值对),这部分不需要经过ObjectMapper处理,也不能混到请求体里,否则Spring会出现参数绑定失败
具体测试步骤
- 处理需要序列化的请求体部分,这部分的写法和你之前测试单参数控制器的逻辑完全一致:
用ObjectMapper把业务请求对象序列化为JSON字符串,通过.content()方法设置到请求里。// 序列化逻辑和单参数测试无差异 String requestContent = new ObjectMapper().writeValueAsString(你的测试业务对象); - 单独传入
@RequestParam修饰的参数,不需要和请求体内容混合:
直接通过MockMvc提供的.param()方法传入参数名和对应的字符串值,Spring会自动完成类型转换(比如把字符串"true"转成boolean类型的true)。.param("obfuscated", "true") - 配置请求对应的Content-Type,匹配请求体的解析要求,避免出现415不支持的媒体类型错误。
.contentType(MediaType.APPLICATION_JSON_VALUE)
完整可参考的测试代码片段
mockMvc.perform( post(PATH_TO_OBFUSCATED) // @RequestBody部分的序列化和单参数场景完全一致 .content(new ObjectMapper().writeValueAsString(testBusinessPayload)) // @RequestParam部分单独配置 .param("obfuscated", "false") .contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk());
常见易错点
- 不要把
@RequestParam的参数强行拼到请求体的JSON里:两类参数的解析渠道完全独立,@RequestParam不会从JSON请求体里取值,@RequestBody也不会解析查询串里的内容 - 后续如果控制器新增更多
@RequestParam参数,只需要链式追加调用.param("参数名", "参数值")即可,不需要调整ObjectMapper的序列化逻辑 - 如果
@RequestBody绑定的是自定义POJO而非String类型,ObjectMapper的序列化逻辑和单参数测试没有区别,只需要保证序列化后的JSON字段和POJO字段匹配即可
内容的提问来源于stack exchange,提问作者HellishHeat
相关产品推荐
相关产品推荐

