PUT方法集成测试返回400 Bad Request问题排查
分析你的400 Bad Request问题
你的测试返回400的核心原因很明确:发送PUT请求时没有传递请求体内容,而控制器的updatePartial方法通过@RequestBody AgencyDto要求必须接收请求体数据,Spring无法解析到必要的参数,因此返回400错误。
具体问题点
看你的测试代码里的mockMvc.perform部分:
mockMvc.perform(put("/agencies/editAgency/" + agency.getId()) .contentType(MediaType.APPLICATION_JSON))
你只设置了请求的contentType为JSON,但完全没有传递任何JSON格式的请求体数据。控制器期望接收一个AgencyDto对象的JSON,但实际请求是空的,这就触发了请求参数不合法的错误。
修复后的测试代码
你需要用objectMapper把要更新的对象序列化为JSON字符串,通过.content()方法添加到请求中。另外注意,控制器接收的是AgencyDto,所以最好构造AgencyDto对象来序列化(如果你的Agency和AgencyDto结构一致,也可以直接用Agency,但更规范的是用Dto):
@Test @DisplayName("Update agency-happy") public void updateAgency() throws Exception { // 初始化原始数据 Agency agency = new Agency(); agency.setId(1); agency.setName("Agency"); agency.setEmail("agency@gmail.com"); doReturn(Collections.singletonList(agency)).when(agencyService).getAll(); // 构造要更新的对象 Agency updatedAgency = new Agency(); updatedAgency.setId(1); updatedAgency.setName("Updated name"); updatedAgency.setEmail("updated@gmail.com"); // 如果有AgencyDto,建议用AgencyDto来构造请求体更贴合实际 // AgencyDto agencyDto = agencyMapper.mapToDto(updatedAgency); when(agencyService.updatePartialDto(updatedAgency, updatedAgency.getId())).thenReturn(updatedAgency); mockMvc.perform(put("/agencies/editAgency/" + updatedAgency.getId()) .contentType(MediaType.APPLICATION_JSON) // 关键:添加请求体内容 .content(objectMapper.writeValueAsString(updatedAgency))) .andExpect(status().isOk()) .andDo(MockMvcResultHandlers.print()); }
额外的排查点
如果修复后还是有400错误,可以检查这些地方:
- 检查
AgencyDto类的字段是否有校验注解(比如@NotNull、@Email等),如果你的测试对象缺失了必填字段,会触发校验失败返回400。 - 确认你的
AgencyMapper是否正确配置,能把AgencyDto正确映射为Agency实体。 - 查看
MockMvcResultHandlers.print()输出的完整响应内容,里面通常会有更详细的错误信息(比如"Required request body is missing"),能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Alessia
相关产品推荐
相关产品推荐

