Mockito测试中清理重定向URL的问题咨询
解决MockMvc测试重定向URL带公共@ModelAttribute属性的问题
我之前也碰到过一模一样的麻烦!用@ControllerAdvice里的@ModelAttribute给九成控制器加了公共属性,虽然靠ignoreDefaultModelOnRedirect在生产环境里清理了重定向URL的冗余属性,但MockMvc测试时这些属性还是会粘在URL上,断言起来特别闹心。下面给你几个实用的解决办法:
1. 全局配置MockMvc忽略默认模型重定向属性
在构建MockMvc的时候直接开启全局忽略,所有测试请求的重定向都会自动去掉公共属性:
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(yourTargetController) .setControllerAdvice(yourGlobalControllerAdvice) // 关键配置:开启忽略默认模型的重定向属性 .setIgnoreDefaultModelOnRedirect(true) .build();
之后断言重定向URL时,直接写目标路径就行,不用再管那些公共属性:
mockMvc.perform(post("/submit-form")) .andExpect(status().is3xxRedirection()) .andExpect(redirectedUrl("/success-page")); // 完美匹配不含公共属性的URL
2. 单个请求单独配置忽略
如果不想全局生效,只想给特定测试请求忽略默认模型属性,可以用with(ignoreDefaultModelOnRedirect())单独设置:
mockMvc.perform(post("/submit-form") .param("userInput", "test-value") // 仅这个请求忽略重定向时的默认模型属性 .with(ignoreDefaultModelOnRedirect())) .andExpect(status().isFound()) .andExpect(redirectedUrl("/success-page"));
3. Spring Boot @WebMvcTest场景下的配置
要是你用Spring Boot的@WebMvcTest做切片测试,可以通过自定义MockMvcBuilder来全局配置:
@WebMvcTest(YourController.class) @Import(YourGlobalControllerAdvice.class) class YourControllerTest { @Autowired private MockMvc mockMvc; // 自定义MockMvcBuilder,全局开启忽略 @Bean public MockMvcBuilder mockMvcBuilder() { return MockMvcBuilders.standaloneSetup(new YourController()) .setControllerAdvice(new YourGlobalControllerAdvice()) .setIgnoreDefaultModelOnRedirect(true); } @Test void testRedirectWithoutCommonAttributes() throws Exception { mockMvc.perform(post("/submit")) .andExpect(status().is3xxRedirection()) .andExpect(redirectedUrl("/success")); } }
问题根源说明
其实ignoreDefaultModelOnRedirect的控制器配置只针对生产环境的请求处理,MockMvc的默认测试配置并不会自动继承这个行为——我们得显式告诉测试环境:重定向时别把默认模型里的公共属性拼到URL上。
内容的提问来源于stack exchange,提问作者narsereg
相关产品推荐
相关产品推荐

