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

Mockito+JUnit测试Spring Controller时合法Patch请求总返回400错误

问题原因与解决方案

为什么测试环境自定义参数解析器不生效

  • 你当前使用MockMvcBuilders.standaloneSetup()构建测试上下文,该模式为Controller独立测试模式,仅加载你指定的Controller实例,不会自动扫描加载项目中的WebMvcConfigurer配置,因此你在AppConfig中注册的DefaultValueHandlerMethodArgumentResolver没有被加入到测试环境的参数解析器链中。
  • 你的测试配置类ControllerTestConfiguration既没有导入AppConfig配置,也没有手动注册自定义参数解析器的Bean,Spring测试上下文无法识别该解析器。
  • 解析器未生效时,Spring默认参数解析器不会处理@DefaultDto标注的参数,导致DTO字段没有被请求体赋值,基础类型int duration默认值为0,触发@Min(1)校验逻辑,直接返回400错误,和你收到的报错完全吻合。

解决方案

方案1:保留独立测试模式,手动注册参数解析器

修改测试类的init方法,构建MockMvc时指定自定义参数解析器,改动最小、测试启动速度快,适合快速验证Controller逻辑:

@BeforeAll
public void init(){
    mockMvc = MockMvcBuilders.standaloneSetup(certificateController)
            // 手动添加自定义参数解析器
            .setCustomArgumentResolvers(new DefaultValueHandlerMethodArgumentResolver())
            .build();
}

如果你的自定义参数解析器依赖其他Spring Bean,可先在测试配置类中注册解析器的Bean,再注入到测试类中传入setCustomArgumentResolvers即可。

方案2:导入Web配置,贴近生产环境测试

修改测试配置类,导入项目中的AppConfig,如果搭配@WebMvcTest注解使用自动注入的MockMvc,无需额外配置即可生效:

@Configuration
@Import(AppConfig.class) // 导入项目中的Web配置类
public class ControllerTestConfiguration {
    // 原有Bean定义保持不变
    ...
}

如果仍使用standaloneSetup模式,还需要按方案1的方式手动添加解析器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:39:03