Java Junit单元测试

方法解析:

  • 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());
    }
API-POST-Json数据格式请求

当时写的时候遇到的问题发送一个被@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);
    }
API-Get

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());
    }
API-Put

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());
    }
API-Delete

以上就是对于几个方法的单元测试的写法整体代码如下:

@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());
    }
}
对于API的测试

猜你喜欢

转载自www.cnblogs.com/myyBlog/p/9001285.html