Spring Boot开发RESTful接⼝服务及单元测试
常用注解解释说明:
- @Controller :修饰class,⽤来创建处理http请求的对象
- @RestController :Spring4之后加⼊的注解,原来在 @Controller 中返回json需要@ResponseBody 来配合,如果直接⽤ @RestController 替代 @Controller 就不需要再配置 @ResponseBody ,默认返回json格式。
- @RequestMapping :配置url映射
下⾯我们尝试使⽤Spring MVC来实现⼀组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参、如何编写单元测试。
RESTful API具体设计如下:
请求类型 | URL | 功能说明 |
---|---|---|
GET | /users | 查询用户列表 |
POST | /users | 创建一个用户 |
GET | /users/id | 根据ID查询一个用户 |
PUT | /users/id | 根据ID更新一个用户 |
DELETE | /users/id | 根据ID删除一个用户 |
User实体定义
package com.kingram.springboot.beans; import lombok.Data; @Data public class User { private Long id; private String name; private Integer age; }
接口实现
package com.kingram.springboot.controller; import com.kingram.springboot.beans.User; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController @RequestMapping(value = "/users") public class UserController { // 创建线程安全的Map private static Map<Long, User> users = Collections.synchronizedMap(new HashMap<>()); @RequestMapping(value = "/", method = RequestMethod.GET) public List<User> getUserList() { List<User> r = new ArrayList<>(users.values()); return r; } @RequestMapping(value = "/", method = RequestMethod.POST) public String postUser(@ModelAttribute User user) { users.put(user.getId(), user); return "success"; } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User getUser(@PathVariable Long id) { return users.get(id); } @RequestMapping(value = "/{id}", method = RequestMethod.PUT) public String putUser(@PathVariable Long id, @ModelAttribute User user) { User u = users.get(id); u.setName(user.getName()); u.setAge(user.getAge()); users.put(id, u); return "success"; } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public String deleteUser(@PathVariable Long id) { users.remove(id); return "success"; } }
测试⽤例
package com.kingram.springboot; import com.kingram.springboot.controller.UserController; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.hamcrest.core.IsEqual.equalTo; 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; @SpringBootTest @DisplayName("Test UserController") public class UserControllerTest { private MockMvc mvc; @BeforeEach void setUp() { mvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); } @Test void testUserController() throws Exception { RequestBuilder request; // (1)get查⼀下user列表,应该为空 request = get("/users/"); mvc.perform(request).andExpect(status().isOk()).andExpect(content().string(equalTo("[]"))); // (2)post提交⼀个user request = post("/users/").param("id", "1").param("name", "张三").param("age", "50"); mvc.perform(request).andExpect(content().string(equalTo("success"))); //(3)get获取user列表,应该有刚才插⼊的数据 request = get("/users/"); mvc.perform(request).andExpect(status().isOk()).andExpect(content().string(equalTo("[{\"id\":1,\"name\":\"张三\",\"age\":50}]"))); // (4)put修改id为1的user request = put("/users/1").param("name", "李四").param("age","30"); mvc.perform(request).andExpect(content().string(equalTo("success"))); // (5)get⼀个id为1的user request = get("/users/1"); mvc.perform(request).andExpect(content().string(equalTo("{\"id\":1,\"name\":\"李四\",\"age\":30}"))); // (6)del删除id为1的user request = delete("/users/1"); mvc.perform(request).andExpect(content().string(equalTo("success"))); // (7)get查⼀下user列表,应该为空 request = get("/users/"); mvc.perform(request).andExpect(status().isOk()) .andExpect(content().string(equalTo("[]"))); } }