企業分散式微服務雲SpringCloud SpringBoot mybatis (三)Spring Boot構建RESTful API與單元測試

allalongx發表於2018-02-09

首先,回顧並詳細說明一下在快速入門中使用的@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具體設計如下:

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等。

企業分散式微服務雲SpringCloud SpringBoot mybatis (三)Spring Boot構建RESTful API與單元測試
原始碼來源:http://minglisoft.cn/honghu/technology.html

相關文章