测试controller
初始化
SpringBoot 中很方便
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloWorldControlerTests {
@Autowired
private MockMvc mockMvc;
}
声明请求
- get:声明发送一个get请求的方法,生成MockHttpServletRequestBuilder。
- 还有其他的请求的方法:post、put、delete等。
MockHttpServletRequestBuilder API:
- header:添加头信息
- contentType:指定请求的contentType头信息
- accept:指定请求的Accept头信息
- content:指定请求Body体内容
- requestAttr:设置请求属性数据
- param:添加request的参数
get
MockHttpServletRequestBuilder builder = get("/test")
.param("size", "5");
post
MockHttpServletRequestBuilder builder = post("/test")
.header("X-Operator", OPERATOR)
.accept(APPLICATION_JSON)
.contentType(APPLICATION_JSON)
.content("{ \"blockIp\": false, \"idList\": [] }");
执行请求
- perform:执行一个RequestBuilder请求,将得到ResultActions;
ResultActions完成如下三件事:
- andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;
- MockMvcResultMatchers 返回 ResultMatcher实例。API如下:
- status:得到响应状态验证器StatusResultMatchers
- header:得到响应Header验证器HeaderResultMatchers
- 等等
- andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台;
- MockMvcResultHandlers提供静态工厂方法print(),返回一个ResultHandler
- andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理;
- getRequest:得到执行的请求
- getResponse:得到执行后的响应
- getAsyncResult:得到异步执行的结果
- 等等
ResultActions actions = mvc.perform(builder);
MvcResult mvcResult = actions
.andExpect(MockMvcResultMatchers.status().is(status.value()))
.andDo(MockMvcResultHandlers.print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
测试示例
测试普通控制器
mockMvc.perform(get("/user/{id}", 1)) //执行请求
.andExpect(model().attributeExists("user")) //验证存储模型数据
.andExpect(view().name("user/view")) //验证viewName
.andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//验证视图渲染时forward到的jsp
.andExpect(status().isOk())//验证状态码
.andDo(print()); //输出MvcResult到控制台
全局配置
mockMvc = webAppContextSetup(wac)
.defaultRequest(get("/user/1").requestAttr("default", true)) //默认请求 如果其是Mergeable类型的,会自动合并的哦mockMvc.perform中的RequestBuilder
.alwaysDo(print()) //默认每次执行请求后都做的动作
.alwaysExpect(request().attribute("default", true)) //默认每次执行后进行验证的断言
.build();