天天看點

Spring Boot建構RESTful API與單元測試

首先,回顧并詳細說明一下在 快速入門 中使用的

@Controller

@RestController

@RequestMapping

注解。如果您對Spring MVC不熟悉并且還沒有嘗試過快速入門案例,建議先看一下 的内容。

  • @Controller

    :修飾class,用來建立處理http請求的對象
  • @RestController

    :Spring4之後加入的注解,原來在

    @Controller

    中傳回json需要

    @ResponseBody

    來配合,如果直接用

    @RestController

    替代

    @Controller

    就不需要再配置

    @ResponseBody

    ,預設傳回json格式。
  • @RequestMapping

    :配置url映射

下面我們嘗試使用Spring MVC來實作一組對User對象操作的RESTful API,配合注釋詳細說明在Spring MVC中如何映射HTTP請求、如何傳參、如何編寫單元測試。

RESTful API具體設計如下:

Spring Boot建構RESTful API與單元測試

User實體定義:

public class User { 
 
    private Long id; 
    private String name; 
    private Integer age; 
 
    // 省略setter和getter 
     
}      

實作對User對象的操作接口

@RestController 
@RequestMapping(value="/users")     // 通過這裡配置使下面的映射都在/users下 
public class UserController { 
 
    // 建立線程安全的Map 
    static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>()); 
 
    @RequestMapping(value="/", method=RequestMethod.GET) 
    public List<User> getUserList() { 
        // 處理"/users/"的GET請求,用來擷取使用者清單 
        // 還可以通過@RequestParam從頁面中傳遞參數來進行查詢條件或者翻頁資訊的傳遞 
        List<User> r = new ArrayList<User>(users.values()); 
        return r; 
    } 
 
    @RequestMapping(value="/", method=RequestMethod.POST) 
    public String postUser(@ModelAttribute User user) { 
        // 處理"/users/"的POST請求,用來建立User 
        // 除了@ModelAttribute綁定參數之外,還可以通過@RequestParam從頁面中傳遞參數 
        users.put(user.getId(), user); 
        return "success"; 
    } 
 
    @RequestMapping(value="/{id}", method=RequestMethod.GET) 
    public User getUser(@PathVariable Long id) { 
        // 處理"/users/{id}"的GET請求,用來擷取url中id值的User資訊 
        // url中的id可通過@PathVariable綁定到函數的參數中 
        return users.get(id); 
    } 
 
    @RequestMapping(value="/{id}", method=RequestMethod.PUT) 
    public String putUser(@PathVariable Long id, @ModelAttribute User user) { 
        // 處理"/users/{id}"的PUT請求,用來更新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/{id}"的DELETE請求,用來删除User 
        users.remove(id); 
        return "success"; 
    } 
 
}      

下面針對該Controller編寫測試用例驗證正确性,具體如下。當然也可以通過浏覽器插件等進行請求送出驗證。

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MockServletContext.class) 
@WebAppConfiguration 
public class ApplicationTests { 
 
    private MockMvc mvc; 
 
    @Before 
    public void setUp() throws Exception { 
        mvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); 
    } 
 
    @Test 
    public void testUserController() throws Exception { 
        // 測試UserController 
        RequestBuilder request = null; 
 
        // 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", "20"); 
        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\":20}]"))); 
 
        // 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("[]"))); 
 
    } 
 
}      

至此,我們通過引入web子產品(沒有做其他的任何配置),就可以輕松利用Spring MVC的功能,以非常簡潔的代碼完成了對User對象的RESTful API的建立以及單元測試的編寫。其中同時介紹了Spring MVC中最為常用的幾個核心注解:

@Controller

,

@RestController

RequestMapping

以及一些參數綁定的注解:

@PathVariable

@ModelAttribute

@RequestParam

等。

https://blog.didispace.com/springbootrestfulapi/#%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B 代碼示例

本文的相關例子可以檢視下面倉庫中的

chapter3-1-1

目錄: