Spring MockMvc触发ConstraintViolationException未进入预期校验如何解决
MockMvc单元测试ConstraintViolationException无法进入断言流程的解决方案
问题根因
- 重复配置MockMvc导致自动配置失效:
@WebMvcTest注解本身会自动装配MockMvc、扫描加载全局异常处理器、校验配置等组件,你在@BeforeEach中通过standaloneSetup手动重新构建MockMvc,会覆盖自动装配的实例,容易出现配置遗漏。 - Mockito参数匹配不生效:测试代码中
given方法传入的productServiceWebRequest和Controller实际调用时构造的ProductServiceWebRequest属性不完全一致,默认Mockito按equals匹配参数,匹配失败会导致你预设的抛出异常逻辑不触发。 - 异常被全局处理器处理后
resolvedException为空:ConstraintViolationException已经被ExceptionAdvice的@ExceptionHandler捕获并转换为标准响应返回,此时MvcResult.getResolvedException()会返回null,你对该值的类型断言会失败,异常直接抛出到测试方法。
解决方案
1. 移除重复的MockMvc配置
删掉@BeforeEach中手动构建MockMvc的代码,直接使用@WebMvcTest自动装配的实例,全局异常处理器会被自动加载无需手动配置:
@WebMvcTest(ProductController.class) public class ProductControllerTest { @Autowired private MockMvc mockMvc; @MockBean private ProductService productService; // 删除整个@BeforeEach方法 }
2. 修正Mockito参数匹配规则
如果不需要严格校验Service入参的内容,直接用any()匹配器规避参数不一致的问题:
// 导入org.mockito.ArgumentMatchers.any BDDMockito.given(productService.createProduct(any(ProductServiceWebRequest.class))) .willThrow(ConstraintViolationException.class);
如果需要校验入参内容,可以使用argThat自定义参数匹配逻辑。
3. 调整断言逻辑
异常已经被全局处理器处理的场景下,无需断言resolvedException,直接校验返回的状态码和响应体即可:
mockMvc.perform(MockMvcRequestBuilders.post("/v1/products") .contentType(MediaType.APPLICATION_JSON).content(json)) .andExpect(MockMvcResultMatchers.status().isBadRequest()) // 可选:校验返回的错误字段符合预期 .andExpect(MockMvcResultMatchers.jsonPath("$.error").value("API_FAIL")) .andExpect(MockMvcResultMatchers.jsonPath("$.errorDetail").value("REQUEST_NOT_CONFORM_PAYLOAD_STANDARD"));
如果你确实需要拿到原始异常做断言,可以在测试类中排除ExceptionAdvice的加载,或者临时注释掉该异常的处理方法,此时异常会被保留在MvcResult.getResolvedException()中,可正常做类型判断。
可选:手动构建MockMvc的补充配置
如果你坚持要用standaloneSetup手动构建MockMvc,需要额外配置校验器避免校验逻辑失效:
@BeforeEach public void setUp() throws Exception { this.mockMvc = MockMvcBuilders.standaloneSetup(new ProductController(productService)) .setControllerAdvice(new ExceptionAdvice()) .setValidator(Validation.buildDefaultValidatorFactory().getValidator()) .build(); }
内容的提问来源于stack exchange,提问作者Ravi Mukti
相关产品推荐
相关产品推荐

