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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:27:38