如何用JUnit5+@SpringBootTest测试Controller的@Valid且不依赖额外Bean与@Validated?
问题:如何在不使用@Validated且不引入额外自定义Bean的情况下测试Controller的@Valid校验
我的Controller代码
import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class ValidController { @GetMapping("/valid") public ResponseEntity<String> valid(@RequestParam(required = false) @Valid @NotNull String firstName, @RequestParam(required = false) String lastName) { System.out.println("firstName = " + firstName); return ResponseEntity.ok(firstName); } }
现有测试代码
@SpringBootTest(classes = ValidController.class) @AutoConfigureMockMvc public class ValidControllerTest { @Autowired private MockMvc mockMvc; @Autowired ServletModelAttributeMethodProcessor servletModelAttributeMethodProcessor; @Test() void validator_valid() throws Exception { mockMvc.perform(get("/valid") .param("lastName", "foo")) .andExpect(status().is4xxClientError()) .andReturn(); } }
问题描述
希望仅测试ValidController本身,不想引入所有自定义Bean,同时不想在生产代码中添加@Validated注解,如何测试Controller中@Valid+@NotNull的参数校验逻辑?
解决方案:用@WebMvcTest + 测试专用校验处理器配置
步骤1:修改测试类
将测试类的@SpringBootTest替换为@WebMvcTest,并添加测试专用的配置类注册MethodValidationPostProcessor:
@WebMvcTest(ValidController.class) public class ValidControllerTest { @Autowired private MockMvc mockMvc; // 仅在测试环境生效的校验处理器配置 @TestConfiguration static class TestValidationConfig { @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } } @Test void validator_valid() throws Exception { mockMvc.perform(get("/valid") .param("lastName", "foo")) .andExpect(status().isBadRequest()) // 明确匹配400错误更准确 .andReturn(); } }
步骤2:生产代码无需修改
保持原Controller代码不变,不需要添加@Validated或其他额外注解。
为什么这样可行
@WebMvcTest是Spring Boot专为Controller测试设计的注解,只会加载MVC核心组件(如DispatcherServlet、MockMvc)和指定的Controller,不会初始化整个应用上下文,完全符合“仅测试Controller”的需求。MethodValidationPostProcessor是Spring处理方法级参数校验的核心Bean,我们在@TestConfiguration中注册它,只会在测试环境生效,不会对生产代码产生任何影响。- 配置完成后,当请求缺少
firstName参数时,@NotNull校验会触发,返回400 Bad Request,满足测试预期。
内容的提问来源于stack exchange,提问作者이성호
相关产品推荐
相关产品推荐

