Spring Boot学习笔记6:构建一个RESTful API并单元测试
我们尝试使用Spring MVC来实现一组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参、如何编写单元测试。
构建RESTful API
RESTful API具体设计如下:
- User实体定义:
@Data
public class User {
private int id;
private String name;
}
- 实现对User对象操作的Controller接口:
package org.csu.restful;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/users")
public class UserController {
// 创建线程安全的Map
static Map<Integer, User> users = Collections.synchronizedMap(new HashMap<Integer, User>());
// 处理"/users/"的GET请求,用来获取用户列表
@GetMapping("/")
public List<User> getUserList() {
List<User> list = new ArrayList<User>(users.values());
return list;
}
// 处理"/users/"的POST请求,用来创建User
@PostMapping("/")
public String postUser(@ModelAttribute User user) {
users.put(user.getId(), user);
return "success";
}
// 处理"/users/{id}"的GET请求,用来获取url中id值对应的User信息
@GetMapping("/{id}")
public User getUser(@PathVariable int id) {
return users.get(id);
}
// 处理"/users/{id}"的PUT请求,用来更新User信息
@PutMapping(value="/{id}")
public String putUser(@PathVariable int id, @ModelAttribute User user) {
User u = users.get(id);
if(u!=null) {
u.setName(user.getName());
users.put(id, u);
}else {
users.put(id, user);
}
return "success";
}
// 处理"/users/{id}"的DELETE请求,用来删除User
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String deleteUser(@PathVariable int id) {
users.remove(id);
return "success";
}
}
- 下面针对该Controller编写测试用例验证正确性,具体如下。当然也可以通过浏览器插件等进行请求提交验证。
package org.csu.restful;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testUserController() throws Exception {
// 测试UserController
RequestBuilder request = null;
// 1、get查一下user列表,应该为空
request = get("/users/");
mockMvc.perform(request)
.andExpect(status().isOk())
.andExpect(content().string("[]"));
// 2、post提交一个user
request = post("/users/")
.param("id", "1")
.param("name", "O大叔Tz");
mockMvc.perform(request)
.andExpect(content().string("success"));
// 3、get获取user列表,应该有刚才插入的数据
request = get("/users/");
mockMvc.perform(request)
.andExpect(status().isOk())
.andExpect(content().string("[{\"id\":1,\"name\":\"O大叔Tz\"}]"));
// 4、put修改id为1的user
request = put("/users/1")
.param("name", "大叔");
mockMvc.perform(request)
.andExpect(content().string("success"));
// 5、get一个id为1的user
request = get("/users/1");
mockMvc.perform(request)
.andExpect(content().string("{\"id\":1,\"name\":\"大叔\"}"));
// 6、del删除id为1的user
request = delete("/users/1");
mockMvc.perform(request)
.andExpect(content().string("success"));
// 7、get查一下user列表,应该为空
request = get("/users/");
mockMvc.perform(request)
.andExpect(status().isOk())
.andExpect(content().string("[]"));
}
}