前置要求:
a.测试类上需要的注解
@SpringBootTest
@AutoConfigureMockMvc
@Slf4j
b.引入MockMvc类
@Autowired
private MockMvc mockMvc;
c.如果需要前置条件可以用before注解
1.get/delete请求
// 查询
@Test
void testQuery() throws Exception {
String content = mockMvc.perform(get("/api/v1/test/list") // 查询请求地址
.param("param1", "...") // 参数(可以多个,如下)
.param("param2", "...")
.header("Authorization", "Bearer " + token) // 增加header参数
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()) // 查询为成功状态才会运行后续方法(.andReturn().getResponse().getContentAsString())
.andReturn().getResponse() // 获取返回数据(封装的全数据)
.getContentAsString(); // 获取返回的的content,就是String结果集
// 格式化打印查询结果
log.info("content:{}", JSONUtil.parse(content).toStringPretty());
}
// 删除
@Test
void testDelete() throws Exception {
String id = "xxxxxxx";
String content = mockMvc.perform(delete("/api/v1/test/"+ id) // 查询请求地址
.header("Authorization", "Bearer " + token) // 增加header参数
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()) // 查询为成功状态才会运行后续方法(.andReturn().getResponse().getContentAsString())
.andReturn().getResponse() // 获取返回数据(封装的全数据)
.getContentAsString(); // 获取返回的的content,就是String结果集
// 格式化打印查询结果
log.info("content:{}", JSONUtil.parse(content).toStringPretty());
}
方法解析:
- perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
- get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
- param:添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种方式,可见后面被@ResponseBody注解参数的解决方法
- andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断);
- andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
- andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);
2.post请求
注意要标注传参类型(.contentType(MediaType.APPLICATION_JSON)
/**
* 新增
*
* @Throws Exception
*/
@Test
void testSave() throws Exception {
/**
* java代码为这样的接口:
* @Operation(description = "保存", summary = "保存")
* @PostMapping("/record")
* public void save(@Validated @RequestBody CheckRoomDto.SaveReqDto req) {
*
* }
*/
// 构建请求 CheckRoomDto.SaveReqDto req
CheckRoomDto.SaveReqDto req = new CheckRoomDto.SaveReqDto();
req.setCheckRoomTime(new Date());
mockMvc.perform(post("/api/v1/test/record/")
.contentType(MediaType.APPLICATION_JSON) // 标注传参类型,application/json
.content(JSONUtil.toJsonStr(req)) // 将dto转换成json格式字符串放到content里面
.header("Authorization", "Bearer " + token)
.accept(MediaType.APPLICATION_JSON)) // 接受的数据的数据格式
.andExpect(status().isOk())
.andReturn().getResponse();// 新增一般没有返回值,如果有,打印同get请求
}