1 MockMvc的使用
利用MockMvc可以快速实现MVC测试
坑01:利用MockMvc进行测试时应用上下文路径是不包含在请求路径中的
1.1 创建一个SpringBoot项目
1.2 创建一个用户实体类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.test.demo.base_demo.entity.po; import java.util.Date; /** * @author 王杨帅 * @create 2018-05-05 22:03 * @desc 用户实体类 **/ public class User { private Integer userId; private String userName; private String password; private Date birthday; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
1.3 创建一个用户控制类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.test.demo.base_demo.controller; import cn.test.demo.base_demo.entity.po.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; /** * @author 王杨帅 * @create 2018-05-05 22:02 * @desc 用户模块控制层 **/ @RestController @RequestMapping(value = "/user") public class UserController { @GetMapping public List<User> queryList() { List<User> userList = new ArrayList<>(); userList.add(new User()); userList.add(new User()); userList.add(new User()); return userList; } }
1.4 创建一个测试类
该测试类主要测试用户控制类中的相关方法
1.4.1 引入测试类注解以及日志注解
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j
1.4.2 依赖注入WebApplicationContext
@Autowired private WebApplicationContext wac;
1.4.3 实例化MockMvc
private MockMvc mockMvc; @Before public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); }
1.4.4 利用MockMvc对象模拟HTTP请求
@Test public void queryList() throws Exception { String result = mockMvc.perform( MockMvcRequestBuilders.get("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) ) .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn().getResponse().getContentAsString(); log.info("===/" + className + "/queryList===" + result); }
1.4.5 测试类代码汇总
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.test.demo.base_demo.controller; import lombok.extern.slf4j.Slf4j; 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.MockMvcBuilder; 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; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class UserControllerTest { private final String className = getClass().getName(); @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } @Test public void queryList() throws Exception { String result = mockMvc.perform( MockMvcRequestBuilders.get("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) ) .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn().getResponse().getContentAsString(); log.info("===/" + className + "/queryList===" + result); } }
2 JsonPath
JsonPath是GitHub上的一个开源项目,主要用来对Json格式的数据进行一些处理
技巧:jsonPath是MockMvcResultMatchers中的一个静态方法
具体使用:点击前往
2.1 简单实例
@Test public void test01() throws Exception { mockMvc.perform( MockMvcRequestBuilders.get("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) ) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3)); }
3 请求参数
3.1 PathVarible
主要获取请求路径中的数据
技巧01:PathVarible获取到的数据是请求路径的一部分
技巧02:@PathVariable注解中的name和value两个成员的作用是一样的,是用来解决路径名和请求处理方法形参名不一致的问题
技巧03:@PathVariable支持正则表达式,如果路径参数不满足正则表达式就会匹配失败;参考博文
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PathVariable { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean required() default true; }
3.1.1 控制类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package cn.test.demo.base_demo.controller;