Restful風格的測試方法


這里總結出兩種方式測試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);
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM