使用MockMvc测试Springboot框架中使用restful风格代码

    MockMvc 是springTest提供的对SpringMvc提供的测试工具。这样可以让单元测试不仅仅局限于对Dao和Service 层的测试。同时,也可以测试Controller层。丰富的单元测试的功能。

一、创建一个SpringBoot项目

二、创建TestController类以及User类

@RunWith(SpringRunner.class) 
@SpringBootTest
public class UserControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    //伪造一个MVC的环境
    private MockMvc mockMvc;

    //在每个test之前构建一个MVC环境
    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
}

 

@Data
public class User {



    private Integer id;


    private String username;


    private String password;


    private Date birthday;
}

三、根据不同的请求方式进行测试

1.测试新增方法,由于restful风格中新增都是使用post请求

如下编写测试方法

    @Test
    public void testCreateUser() throws Exception {
        String content = "{\"username\":\"张三\",\"password\":123456}";
        String asString = mockMvc.perform(MockMvcRequestBuilders.post("/user")  //访问地址,请求使用post方式
                .contentType(MediaType.APPLICATION_JSON_UTF8)   //json 格式
                .content(content))   //json内容
                .andExpect(MockMvcResultMatchers.status().isOk())   //判断返回状态是否成功
                .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1)) //返回json的内容,比如这里返回一个id等于1的用户
                .andReturn().getResponse().getContentAsString();//将返回JSON打印成String
        System.out.println(asString);
    }

 

控制器中的方法为

    /**
     * @Description 新增用户
     */
    @PostMapping("/user")
    public User createUser(@RequestBody User user) {
        System.out.println(user.toString());
        user.setId(1);
        return user;
    }

 

测试结果如下

 

2.测试修改方法,修改一般都是使用put方法

    @Test
    public void editUser() throws Exception {
        String content = "{\"id\":\"1\",\"username\":\"张三\",\"password\":123456}";
        String asString = mockMvc.perform(MockMvcRequestBuilders.put("/user")  //访问地址,请求方式为put
                .contentType(MediaType.APPLICATION_JSON_UTF8)   //json 格式
                .content(content))   //json内容
                .andExpect(MockMvcResultMatchers.status().isOk())   //判断返回状态是否成功
                .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1))//返回json的内容,比如这里返回一个id等于1的用户
                .andReturn().getResponse().getContentAsString();//将返回JSON打印成String
        System.out.println(asString);
    }

控制器方法为


    /**
     * @Description 修改用户
     */
    @PutMapping("/user")
    public User editeUser(@RequestBody User user) {
        System.out.println(user.toString());
        user.setId(1);
        return user;
    }

测试结果为:

 

3.测试删除方法,删除在rest编码中一般都是使用delete的请求方式

测试方法为

    @Test
    public void deleteUser() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.delete("/user/1")  //访问地址,请求方式为delete,删除一个id为 1 User用户
                .contentType(MediaType.APPLICATION_JSON_UTF8))  //json 格式  //json内容
                .andExpect(MockMvcResultMatchers.status().isOk());   //判断返回状态是否成功

    }

控制器方法为:

    /**
     * @Description 删除用户, 路径中的 {id:\\d+} 表示正则,id必须是数字
     */
    @DeleteMapping("/user/{id:\\d+}")
    public void deleteUser(@PathVariable Integer id) {
        System.out.println("删除成功");
    }

测试结果

4.测试查询集合的方法,在rest编码中查询一般都是使用get的请求方式

 

测试方法为

   /**
     * @Description  查询用户名为张三的 集合,如果不需要参数就不需要写param  ,多个参数就写多个param即可
     */
    @Test
    public void listUserByUserName() throws Exception {
        String asString = mockMvc.perform(MockMvcRequestBuilders.get("/user")  //访问地址  请求方式为 get
                .param("username", "张三")
                .contentType(MediaType.APPLICATION_JSON_UTF8))  //json 格式
                .andExpect(MockMvcResultMatchers.status().isOk())   //判断返回状态是否成功
                .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3))//返回json的内容,比如集合的长度
                .andReturn().getResponse().getContentAsString();//将返回JSON打印成String
        System.out.println(asString);
    }

控制器方法为:

  @GetMapping("/user")
    public List getUser(String username) {
        System.out.println(username);
        List list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }

测试结果为

5.测试查询单个用户的方法,也使用get的请求方式

测试方法为

    @Test
    public void getUserInfo() throws Exception {
        String asString = mockMvc.perform(MockMvcRequestBuilders.get("/user/1") //访问地址  请求方式为 get 请求id为 1 User用户
                .contentType(MediaType.APPLICATION_JSON_UTF8))//json 格式
                .andExpect(MockMvcResultMatchers.status().isOk())//判断返回状态是否成功
                .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("张三"))  //返回的json内容中有有个名字叫张三的用户
                .andReturn().getResponse().getContentAsString();//将返回JSON打印成String
        System.out.println(asString);
    }

控制器方法

   /**
     * @Description 查询用户, 路径中的 {id:\\d+} 表示正则,id必须是数字
     */
    @GetMapping("/user/{id:\\d+}")
    @JsonView(User.UserDetailView.class)
    public User getUserInfo(@PathVariable String id) {
        System.out.println(id);
        User user = new User();
        user.setUsername("张三");
        return user;
    }

测试结果

以上几种方式基本覆盖解决使用springtest的MockMvc对Controller进行单元测试的需求。

 

你可能感兴趣的:(SpringBoot框架,Java)