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
相关产品推荐
相关产品推荐

