這里總結出兩種方式測試restful
① RestTemplate
② MockMvc
1、Users.class
package com.testRestful.model; import lombok.Data; /** * @author * @date 2018/6/25 */ @Data public class Users { private String id; private String userName; private String password; private String age; private String email; }
2.UserService.class
package com.testRestful.service; import com.testRestful.model.Users; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class UserService { /** * 查詢所有用戶 * @return */ public List<Users> getAll() { List<Users> list = new ArrayList<>(); Users users = new Users(); users.setId("001"); users.setUserName("xxxxx"); users.setAge("20"); users.setEmail("1232@qq.com"); Users users1 = new Users(); users1.setId("002"); users1.setUserName("qqqq"); users1.setAge("18"); users1.setEmail("1232@qq.com"); list.add(users); list.add(users1); return list; } /** * 根據id查詢用戶 * @param id * @return */ public Users getUserById(String id) { Users users = new Users(); users.setId(id); users.setUserName("xxxxx"); users.setAge("20"); users.setEmail("1232@qq.com"); return users; } /** * 根據id刪除用戶 * @param id * @return */ public Users deleteUserById(String id) { //執行刪除操作 Users users = new Users(); users.setId(id); users.setUserName("該用戶是刪除的用戶"); users.setAge("20"); users.setEmail("1232@qq.com"); return users; } /** * 根據id修改用戶 * @param id * @return */ public Users editUserById(String id) { //執行修改操作 Users users = new Users(); users.setId(id); users.setUserName("該用戶是修改的用戶"); users.setAge("20"); users.setEmail("1232@qq.com"); return users; } /** * 保存用戶 * @param users * @return */ public Users save(Users users) { //執行保存操作 return users; } }
3. UserController.class
package com.testRestful.controller; import com.testRestful.model.Users; import com.testRestful.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController public class UserController { @Autowired private UserService userService; /** * 查詢所有用戶 * @return */ @RequestMapping(value = "users",method = RequestMethod.GET) public List<Users> getAll() { List<Users> users = userService.getAll(); return users; } /** * 根據id查詢用戶通過占位符GET方式(restTemplate使用的方法) * @param id * @return */ @RequestMapping(value = "users/{id}",method = RequestMethod.GET) public Users getUserById(@PathVariable(name = "id") String id) { return userService.getUserById(id); } /** * 根據id查詢用戶通過占位符GET方式(mockMvc使用的方法) * @param id * @return */ @RequestMapping(value = "getusers",method = RequestMethod.GET) public Users getUsers(String id) { return userService.getUserById(id); } /** * 根據id刪除用戶 * @param id * @return */ @RequestMapping(value = "users/{id}",method = RequestMethod.DELETE) public Users deleteUserById(@PathVariable(name = "id") String id) { System.out.println("請求的參數為:" + id); return userService.deleteUserById(id); } /** * 根據id修改用戶 * @param id * @return */ @RequestMapping(value = "users/{id}",method = RequestMethod.PUT) public Users editUserById(@PathVariable(name = "id") String id) { System.out.println("請求的參數為:" + id); return userService.editUserById(id); } /** * 保存用戶(restTemplate使用的方法) * @param users * @return */ @RequestMapping(value = "save",method = RequestMethod.POST) public Users save(@RequestBody Users users) { return userService.save(users); } /** * 保存用戶(mockMvc使用的方法) * @param users * @return */ @RequestMapping(value = "saveAdd",method = RequestMethod.POST) public Users saveAdd(Users users) { return userService.save(users); } /** * 根據id查詢用戶通過傳參POST方式 * @param id * @return */ @RequestMapping(value = "getUserByIdRePost",method = RequestMethod.POST) public Users getUserByIdRePost(@RequestBody String id) { return userService.getUserById(id); } }
4.RestTemplate測試方法
總結RestTemplate
①GET getForEntity和getForObject只能通過url占位符進行傳參
②DELETE delete
③PUT put
④POST postForEntity和postForObject可以進行傳參但是controller參數要通過@RequestBody注解才能獲取
Users getUserByIdRePost(@RequestBody String id)
Users save(@RequestBody Users users)
package com.testRestful.test; import com.testRestful.model.Users; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.List; /** * @author luoxianwei * @date 2018/6/22 * * 總結RestTemplate * ①GET getForEntity和getForObject只能通過url占位符進行傳參 * ②DELETE delete * ③PUT put * ④POST postForEntity和postForObject可以進行傳參但是controller參數要通過@RequestBody注解才能獲取 * Users getUserByIdRePost(@RequestBody String id) * Users save(@RequestBody Users users) */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class TestRestTemplate { public static final RestTemplate restTemplate = new RestTemplate(); /** * 查詢所有用戶 */ @Test public void getAll() { ResponseEntity<List> responseEntity = restTemplate.getForEntity("http://localhost:8083/users", List.class); List list = responseEntity.getBody(); System.out.println("getForEntity請求回來的值是:" + list.toString()); List lists = restTemplate.getForObject("http://localhost:8083/users", List.class); System.out.println("getForObject請求回來的值是:" + lists.toString()); } /** * ①根據id查詢用戶通過占位符GET方式 */ @Test public void getUserById() { ResponseEntity<Users> responseEntity = restTemplate.getForEntity("http://localhost:8083/users/22222222222", Users.class); System.out.println("getForEntity請求回來的對象是:" + responseEntity.getBody()); Users user = restTemplate.getForObject("http://localhost:8083/users/001", Users.class); System.out.println("getForObject請求回來的對象是:" + user); } /** * ②根據id查詢用戶通過傳參 * 1.getForEntity(String url,Class responseType,Object...urlVariables): * 該方法提供了三個參數,其中url為請求的地址,responseType為請求響應體body的包裝類型,urlVariables為url中的參數綁定。 * GET請求的參數綁定通常使用url中拼接的方式,比如http://USER-SERVICE/user?name=did我們可以像這樣自已將參數拼接到url中, * 但更好的方法是在url中使用占位符並配合urlVariables參數實現GET請求的參數綁定, * 比如url定義為htip://USER-SERVICE/user?name={1},然后可以這樣來調用: * getForEntity("http://USER-SERVICE/user?name={1}",String.class,"didi")'其中第三個參數didi會替換url中的{1}占位符。 * <p> * 這里需要注意的是,由於urlVariables參數是一個數組,所以它的順序會對應url中占位符定義的數字順序。 */ @Test public void getUserById2() { String id = "22222222222"; ResponseEntity<Users> responseEntity = restTemplate.getForEntity("http://localhost:8083/users/{id}", Users.class, id); ResponseEntity<Users> responseEntity1 = restTemplate.getForEntity("http://localhost:8083/users/{1}", Users.class, id); System.out.println("getForEntity請求回來的對象是①:" + responseEntity.getBody()); System.out.println("getForEntity請求回來的對象是②:" + responseEntity1.getBody()); Users user = restTemplate.getForObject("http://localhost:8083/users/{id}", Users.class, id); System.out.println("getForObject請求回來的對象是:" + user); } /** * ③根據id查詢用戶通過使用map封裝參數 * 2.getForEntity(String url,Class responseType,Map urlVariables): * 該方法提供的參數中,只有urlVariables的參數類型與上面的方法不同。這里使用了Map類型,所以使用該方法進行參數綁定時需要在占位符中指定Map中參 * 數的key值,比如url定義為http://USER-SERVICE/user?name={name),在Map類型的urlVariables中,我們就需要put一個key為name的參數來綁 * 定url中{name}占位符的值,比如: */ @Test public void getUserByIdMap() { HashMap<String, String> map = new HashMap<>(); map.put("id", "666666666"); ResponseEntity<Users> responseEntity = restTemplate.getForEntity("http://localhost:8083/users/{id}", Users.class, map); System.out.println("getForEntity請求回來的對象是:" + responseEntity.getBody()); Users user = restTemplate.getForObject("http://localhost:8083/users/{id}", Users.class, map); System.out.println("getForObject請求回來的對象是:" + user); } /** * 根據id刪除用戶 */ @Test public void deleteUserById() { restTemplate.delete("http://localhost:8083/users/001"); System.out.println("delete方法沒有返回值"); } /** * 根據id修改用戶 */ @Test public void editUserById() { restTemplate.put("http://localhost:8083/users/003", String.class); System.out.println("put方法沒有返回值"); } /** * 保存用戶 */ @Test public void save() { Users users = new Users(); users.setId("888"); users.setUserName("xxxxx"); users.setAge("20"); users.setEmail("1232@qq.com"); ResponseEntity<Users> responseEntity = restTemplate.postForEntity("http://localhost:8083/save", users, Users.class); Users users1 = responseEntity.getBody(); System.out.println("postForEntity保存的對象為:" + users1); Users users2 = restTemplate.postForObject("http://localhost:8083/save", users, Users.class); System.out.println("postForObject保存的對象為:" + users2); } /** * 根據id查詢用戶通過傳參POST方式 */ @Test public void getUserByIdRePost() { String id = "9999999"; ResponseEntity<Users> responseEntity = restTemplate.postForEntity("http://localhost:8083/getUserByIdRePost", id, Users.class); Users users1 = responseEntity.getBody(); System.out.println("postForEntity根據id查詢用戶通過傳參獲得對象為:" + users1); Users users2 = restTemplate.postForObject("http://localhost:8083/getUserByIdRePost", id, Users.class); System.out.println("postForObject根據id查詢用戶通過傳參獲得對象為:" + users2); } }
5.MockMvc測試方法
package com.testRestful.test; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Configuration @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class TestRestMockMvc { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } /** * 測試獲得一個對象① * * @throws Exception */ @Test public void testDetailUser() throws Exception { ResultActions resultActions = mockMvc.perform(get("/users/c240da50-013b-4b3d-8c46-77976e288497") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); MockHttpServletResponse response = resultActions.andReturn().getResponse(); String contentAsString = response.getContentAsString(); System.out.println("獲取的對象為:" + contentAsString); } /** * 測試獲得一個對象② * * @throws Exception */ @Test public void testDetailUser2() throws Exception { ResultActions resultActions = mockMvc.perform(get("/getusers").param("id","00232") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); MockHttpServletResponse response = resultActions.andReturn().getResponse(); String contentAsString = response.getContentAsString(); System.out.println("獲取的對象為:" + contentAsString); } /** * 測試刪除一個對象 * * @throws Exception */ @Test public void testDeleteUser() throws Exception { ResultActions resultActions = mockMvc.perform(delete("/users/c240da50-013b-4b3d-8c46-77976e288497") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); MockHttpServletResponse response = resultActions.andReturn().getResponse(); String contentAsString = response.getContentAsString(); System.out.println("刪除一個對象為:" + contentAsString); } /** * 測試修改一個對象 * * @throws Exception */ @Test public void testPutUser() throws Exception { ResultActions resultActions = mockMvc.perform(put("/users/c240da50-013b-4b3d-8c46-77976e288497") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); MockHttpServletResponse response = resultActions.andReturn().getResponse(); String contentAsString = response.getContentAsString(); System.out.println("修改一個對象為:" + contentAsString); } /** * 測試添加一個對象 * * @throws Exception */ @Test public void testPostUser() throws Exception { ResultActions resultActions = mockMvc.perform(post("/saveAdd").param("userName", "test").param("age", "18") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); MockHttpServletResponse response = resultActions.andReturn().getResponse(); String contentAsString = response.getContentAsString(); System.out.println("添加一個對象為:" + contentAsString); } /** * 測試獲得所有對象 * * @throws Exception */ @Test public void testGetAllUser() throws Exception { ResultActions resultActions = mockMvc.perform(get("/users") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); MockHttpServletResponse response = resultActions.andReturn().getResponse(); String contentAsString = response.getContentAsString(); System.out.println("獲得所有對象為:" + contentAsString); } }