使用MockMvc如何正确断言返回的响应内容与Model均为null
MockMvc 断言响应体为空、Model为null的正确实现
原写法失效原因
content().isNull()校验逻辑是判断响应体的字节数组为null,但Spring MVC处理请求时,即使没有返回任何业务内容,响应体也会被初始化为空字符串,不会返回null,因此匹配失败model().isNull()校验逻辑是判断Model实例为null,但Spring MVC的model()相关Matcher默认会先判定ModelAndView不为null,且正常请求流程中会自动初始化空Model实例,永远不会触发null匹配
修正后的实现代码
通用场景(请求已进入Controller处理流程)
如果请求已经进入Controller层处理,仅需要校验响应体为空、Model无任何属性,写法如下:
import static org.hamcrest.Matchers.emptyString; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; mockMvc.perform(get("/test") .headers(assembleBasicAuthHeader("idontexist", "gibberish"))) .andExpect(status().isForbidden()) // 校验响应体为空字符串 .andExpect(content().string(emptyString())) // 校验Model中无任何自定义属性 .andExpect(model().size(0)) .andExpect(status().reason(containsString("Forbidden")));
权限拦截场景(请求未进入Controller处理流程)
如果是Spring Security等过滤器提前拦截返回403,未进入Controller处理流程,此时不会生成ModelAndView对象,可以用自定义ResultMatcher实现严格的null校验,直接使用Junit自带的断言工具类即可:
import static org.junit.jupiter.api.Assertions.assertNull; import static org.hamcrest.Matchers.emptyString; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; mockMvc.perform(get("/test") .headers(assembleBasicAuthHeader("idontexist", "gibberish"))) .andExpect(status().isForbidden()) .andExpect(content().string(emptyString())) // 直接校验ModelAndView为null .andExpect(result -> assertNull(result.getModelAndView())) .andExpect(status().reason(containsString("Forbidden")));
内容的提问来源于stack exchange,提问作者Stephan Hogenboom
相关产品推荐
相关产品推荐

