方法解析:
- 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;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);
1.对于post类型的接口进行参数传递(Content-Type类型为:application/json,Body类型为raw,即接口传入Json字符串),
例如:
对于这种接口请求,Controller层的单元测试代码:
@Test public void MallTypesAdd() throws Exception { String data="{\n" + " \"name\": \"接口测试啦啦啦\",\n" + " \"note\": \"接口测试描述啦啦啦\",\n" + " \"weight\":39\n" + "}"; MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("接口地址,例如:/api/users") .contentType(MediaType.APPLICATION_JSON).content(data) .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andReturn(); Assert.assertEquals(200,result.getResponse().getStatus()); }
当时写的时候遇到的问题发送一个被@ResponseBody标识的参数,一直到400错误。 即无法发送一个json格式的数据到Controller层。改为以上的代码之后就可以了
注意上面contentType需要设置成MediaType.APPLICATION_JSON,即声明是发送“application/json”格式的数据。使用content方法,将转换的json数据放到request的body中。
2.对于Get方法的请求:
@Test public void getMallType() throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/api/manage/mall/types/1") .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andExpect(MockMvcResultMatchers.status().isOk()) // .andDo(MockMvcResultHandlers.print()) //打印内容 // .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8)).andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("OK"))) //匹配返回值中的内容 // .andExpect((ResultMatcher) MockMvcResultMatchers.jsonPath("$.errcode",MockMvcResultMatchers.status().is(200)))////使用jsonPath解析返回值,判断具体的内容 .andReturn(); Assert.assertEquals(result.getResponse().getStatus(),200); }
3.对于PUT方法请求
@Test public void updateMallTypeById() throws Exception { String json="{\n" + " \"name\":\"QQQ\",\n" + "\t\"weight\":6,\n" + "\t\"note\":\"QQQ\"\n" + "}"; MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/api/manage/mall/types/{id}",6) //也可以写成这样的:mockMvc.perform(MockMvcRequestBuilders.put("/api/manage/mall/types/6") .contentType(MediaType.APPLICATION_JSON).content(json) .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); System.out.println("返回结果:"+result.getResponse().getContentAsString()); assertEquals(200,result.getResponse().getStatus()); }
4。对于Delete方法请求
@Test public void deleteMallType() throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.delete("/api/manage/mall/types/{id}",6) //也可以写成这样的:mockMvc.perform(MockMvcRequestBuilders.delete("/api/manage/mall/types/6") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); System.out.println("返回结果:"+result.getResponse().getContentAsString()); assertEquals(200,result.getResponse().getStatus()); }
以上就是对于几个方法的单元测试的写法整体代码如下:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MallEquipmentControllerTest { @Autowired private MockMvc mockMvc; @Autowired private WebApplicationContext context; @Before public void setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();//建议使用这种 //this.mockMvc = MockMvcBuilders.standaloneSetup(mallEquipmentController).build(); } @Test //1.添加商城分类信息 public void MallTypesAdd() throws Exception { String data="{\n" + " \"name\": \"接口测试啦啦啦\",\n" + " \"note\": \"接口测试描述啦啦啦\",\n" + " \"weight\":39\n" + "}"; MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("接口地址,例如:/api/users") .contentType(MediaType.APPLICATION_JSON).content(data) .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andReturn(); Assert.assertEquals(200,result.getResponse().getStatus()); } @Test //4.根据id获取商城分类信息 public void getMallType() throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/api/manage/mall/types/1") .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andExpect(MockMvcResultMatchers.status().isOk()) // .andDo(MockMvcResultHandlers.print()) //打印内容 // .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8)).andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("OK"))) //匹配返回值中的内容 // .andExpect((ResultMatcher) MockMvcResultMatchers.jsonPath("$.errcode",MockMvcResultMatchers.status().is(200)))////使用jsonPath解析返回值,判断具体的内容 .andReturn(); Assert.assertEquals(200,result.getResponse().getStatus()); } //2.编辑商城分类信息 @Test public void updateMallTypeById() throws Exception { String json="{\n" + " \"name\":\"QQQ\",\n" + "\t\"weight\":6,\n" + "\t\"note\":\"QQQ\",\n" + "\t\"removeIds\":[1,2]\n" + "}"; MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/api/manage/mall/types/{id}",6) //也可以写成这样的:mockMvc.perform(MockMvcRequestBuilders.put("/api/manage/mall/types/6") .contentType(MediaType.APPLICATION_JSON).content(json) .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); System.out.println("返回结果:"+result.getResponse().getContentAsString()); assertEquals(200,result.getResponse().getStatus()); } //3.删除商城分类信息 @Test public void deleteMallType() throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.delete("/api/manage/mall/types/{id}",6) //也可以写成这样的:mockMvc.perform(MockMvcRequestBuilders.delete("/api/manage/mall/types/6") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) //接收的类型 .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); System.out.println("返回结果:"+result.getResponse().getContentAsString()); assertEquals(200,result.getResponse().getStatus()); } }