Junit单元测试之MockMvc

在测试restful风格的接口时,springmvc为我们提供了MockMVC架构,使用起来也很方便。

下面写个笔记,便于以后使用时参考备用。

一 场景

1 . 提供一个restful风格的接口

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import qinfeng.zheng.mockmvcdemo.dto.User;

import java.util.ArrayList;
import java.util.List;

@RestController
public class UserController {
    
    @GetMapping("/users")
    public List<User> getUserList() {
        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        return users;
    }
}
@Data
public class User {
    private String username;
    private String password;
}

2. MockMVC测试代码

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

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

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test
    public void getUserList() throws Exception {
        // perform : 执行请求 ;  MockMvcRequestBuilders.get("/url") : 构造一个get请求
        mockMvc.perform(MockMvcRequestBuilders.get("/users")// 请求type : json
                .contentType(MediaType.APPLICATION_JSON))
                // 期望的结果状态 200
                .andExpect(MockMvcResultMatchers.status().isOk())
                // 期望的返回结果集合有2个元素 , $: 返回结果
                .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
    }
}

3. 运行测试代码 

二 场景2

1. 提供一个restful接口

 @GetMapping("/getUser")
 public User getUser(String username) {
      User user = new User();
      user.setUsername(username);
      user.setPassword("123");
      return user;
 }

2. 测试代码 

  @Test
    public void getUserByUsername() throws Exception {
        // perform : 执行请求 ;  MockMvcRequestBuilders.get("/url") : 构造一个get请求
        mockMvc.perform(MockMvcRequestBuilders.get("/getUser")
                .param("username","admin")
                // 请求type : json
                .contentType(MediaType.APPLICATION_JSON))
                // 期望的结果状态 200
                .andExpect(MockMvcResultMatchers.status().isOk())
                // 期望的返回结果集合有2个元素 , $: 返回结果
                .andExpect(MockMvcResultMatchers.jsonPath("$.password").value("123"));
    }

三 场景3

1. 提供一个restful风格的接口

 @GetMapping("/getUser3")
    public User getUserList(User user) {
        System.out.println(ReflectionToStringBuilder.toString(user,ToStringStyle.MULTI_LINE_STYLE));
        user.setUsername(user.getUsername()+",UK");
        user.setPassword(user.getPassword()+",US");
        return user;
    }

2. MockMVC测试代码

 @Test
    public void test3() throws Exception {
        // perform : 执行请求 ;  MockMvcRequestBuilders.get("/url") : 构造一个get请求
        mockMvc.perform(MockMvcRequestBuilders.get("/getUser3")
                //springmvc会将username,password封装成一个User对象
                .param("username","admin")
                .param("password","123")
                // 请求type : json
                .contentType(MediaType.APPLICATION_JSON))
                // 期望的结果状态 200
                .andExpect(MockMvcResultMatchers.status().isOk())
                // 期望的返回结果集合有2个元素 , $: 返回结果
                .andExpect(MockMvcResultMatchers.jsonPath("$.password").value("123,US"));
    }

四 场景4

1. 接口代码

  /**
     * {id:d+} 正则表达式表明id只能是数字
     * @param id
     * @return
     */
    @GetMapping("/user/{id:\d+}")
    public User getUserInfo(@PathVariable("id") String id) {
        User user = new User();
        return user;
    }

2. 测试代码

    @Test
    public void test4() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/user/a")
                .contentType(MediaType.APPLICATION_JSON))
                // 期待返回的状态码是4XX
                .andExpect(MockMvcResultMatchers.status().is4xxClientError());
    }

五 post请求

1. 接口代码

  @PostMapping("/user")
    public User createUser(@RequestBody User user) {
        System.out.println(user);
        user.setAge(100);
        return user;
    }

2. 测试代码 

 @Test
    public void testCreateUser() throws Exception {
        String jsonUser = "{"username":"admin","password":"123"}";
        mockMvc.perform(MockMvcRequestBuilders.post("/user")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonUser))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.age").value("100"));
    }

3. 测试结果

原文地址:https://www.cnblogs.com/z-qinfeng/p/11722783.html