MockMvc 是springTest提供的对SpringMvc提供的测试工具。这样可以让单元测试不仅仅局限于对Dao和Service 层的测试。同时,也可以测试Controller层。丰富的单元测试的功能。
@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;
}
如下编写测试方法
@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;
}
测试结果如下
@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;
}
测试结果为:
测试方法为
@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("删除成功");
}
测试结果
测试方法为
/**
* @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;
}
测试结果为
测试方法为
@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;
}
测试结果