zoukankan      html  css  js  c++  java
  • Junit单元测试之MockMvc

    在测试restful风格的接口时,springmvc为我们提供了MockMVC架构,使用起来也很方便。

    下面写个笔记,便于以后使用时参考备用。

    一 场景

    1 . 提供一个restful风格的接口

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import qinfeng.zheng.mockmvcdemo.dto.User;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @RestController
    public class UserController {
        
        @GetMapping("/users")
        public List<User> getUserList() {
            List<User> users = new ArrayList<>();
            users.add(new User());
            users.add(new User());
            return users;
        }
    }
    @Data
    public class User {
        private String username;
        private String password;
    }

    2. MockMVC测试代码

    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.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class AppTest {
    
        @Autowired
        private WebApplicationContext wac;
    
        private MockMvc mockMvc;
    
        @Before
        public void setup() {
            mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        }
    
        @Test
        public void getUserList() throws Exception {
            // perform : 执行请求 ;  MockMvcRequestBuilders.get("/url") : 构造一个get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/users")// 请求type : json
                    .contentType(MediaType.APPLICATION_JSON))
                    // 期望的结果状态 200
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    // 期望的返回结果集合有2个元素 , $: 返回结果
                    .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
        }
    }

    3. 运行测试代码 

    二 场景2

    1. 提供一个restful接口

     @GetMapping("/getUser")
     public User getUser(String username) {
          User user = new User();
          user.setUsername(username);
          user.setPassword("123");
          return user;
     }

    2. 测试代码 

      @Test
        public void getUserByUsername() throws Exception {
            // perform : 执行请求 ;  MockMvcRequestBuilders.get("/url") : 构造一个get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/getUser")
                    .param("username","admin")
                    // 请求type : json
                    .contentType(MediaType.APPLICATION_JSON))
                    // 期望的结果状态 200
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    // 期望的返回结果集合有2个元素 , $: 返回结果
                    .andExpect(MockMvcResultMatchers.jsonPath("$.password").value("123"));
        }

    三 场景3

    1. 提供一个restful风格的接口

     @GetMapping("/getUser3")
        public User getUserList(User user) {
            System.out.println(ReflectionToStringBuilder.toString(user,ToStringStyle.MULTI_LINE_STYLE));
            user.setUsername(user.getUsername()+",UK");
            user.setPassword(user.getPassword()+",US");
            return user;
        }

    2. MockMVC测试代码

     @Test
        public void test3() throws Exception {
            // perform : 执行请求 ;  MockMvcRequestBuilders.get("/url") : 构造一个get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/getUser3")
                    //springmvc会将username,password封装成一个User对象
                    .param("username","admin")
                    .param("password","123")
                    // 请求type : json
                    .contentType(MediaType.APPLICATION_JSON))
                    // 期望的结果状态 200
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    // 期望的返回结果集合有2个元素 , $: 返回结果
                    .andExpect(MockMvcResultMatchers.jsonPath("$.password").value("123,US"));
        }

    四 场景4

    1. 接口代码

      /**
         * {id:d+} 正则表达式表明id只能是数字
         * @param id
         * @return
         */
        @GetMapping("/user/{id:\d+}")
        public User getUserInfo(@PathVariable("id") String id) {
            User user = new User();
            return user;
        }

    2. 测试代码

        @Test
        public void test4() throws Exception {
            mockMvc.perform(MockMvcRequestBuilders.get("/user/a")
                    .contentType(MediaType.APPLICATION_JSON))
                    // 期待返回的状态码是4XX
                    .andExpect(MockMvcResultMatchers.status().is4xxClientError());
        }

    五 post请求

    1. 接口代码

      @PostMapping("/user")
        public User createUser(@RequestBody User user) {
            System.out.println(user);
            user.setAge(100);
            return user;
        }

    2. 测试代码 

     @Test
        public void testCreateUser() throws Exception {
            String jsonUser = "{"username":"admin","password":"123"}";
            mockMvc.perform(MockMvcRequestBuilders.post("/user")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(jsonUser))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.age").value("100"));
        }

    3. 测试结果

  • 相关阅读:
    解决360浏览器兼容模式的页面显示问题
    .NET知识点汇总
    C# 6.0新加特性
    C# 5.0新加特性
    C# 4.0新加特性
    C# 3.0新加特性
    C# 2.0新加特性
    C#中null、""、string.empty区别
    C#使用SQLite
    页面 关于处理如何点击按钮实现定位到某一位置操作
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/11722783.html
Copyright © 2011-2022 走看看