You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:54:09