在测试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. 测试结果

Junit单元测试之MockMvc的更多相关文章

  1. spring boot单元测试之MockMvc

    spring单元测试之MockMvc,这个只是模拟,并不是真正的servlet,所以session.servletContext是没法用的. @RunWith(SpringRunner.class) ...

  2. SpringMVC单元测试之MockMVC,模拟登入用户

    今天介绍一下springMVC的单元测试,可以参考spring官方文档进行 前提准备,springmvc的demo工程,这里就不做叙述了 pom.xml [html] view plain copy ...

  3. SSM整合junit单元测试之org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    想用SSM做一点小测试,项目整合完毕,直接使用junit测试mybatis,出现如下错误(SuperTest类中进行了spring运行环境加载): 解决思路: 检查mapper接口与mapper.xm ...

  4. 玩转单元测试之Testing Spring MVC Controllers

    玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spri ...

  5. 补习系列(8)-springboot 单元测试之道

    目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...

  6. [转载]单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...

  7. 单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...

  8. 单元测试之Qunit

    单元测试之Qunit 前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QU ...

  9. Android单元测试之二:本地测试

    Android单元测试之二:本地测试 本地测试 本地测试( Local tests):只在本地机器 JVM 上运行,以最小化执行时间,这种单元测试不依赖于 Android 框架,或者即使有依赖,也很方 ...

随机推荐

  1. JDBC连接sql server数据库的详细步骤和代码 转

    JDBC连接sql server数据库的步骤如下: 1.加载JDBC驱动程序(只做一次): 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.C ...

  2. P哥的桶(线段树+线性基)

    https://www.luogu.org/problem/P4839 题目: 有两个操作 1 a b  在a的位置添加b数值  (注意一个位置可以有多个值) 2 a b : 在 a到b的范围任取任意 ...

  3. MySQL5.6同步指定数据库

    需求:生产环境同步sakila (root@localhost) [(none)]> show databases;+--------------------+| Database |+---- ...

  4. 线段树2(P3373)

    传送 感谢洛谷题解让我理清了这一撮标记 这里多了一个乘法操作,乘法的优先级高于加法.我们来思考一下有关标记的问题. 首先由两种操作,可以想到要有两个标记,一个标记乘法(mul[k]),一个标记加法(a ...

  5. mysql_备份_mysqldump

    命令行执行mysqldump mysqldump -uuser -pPassword dbnametable [option] > xx.sql;mysqldump• Mysqldump常用参数 ...

  6. day15—jQuery UI之widgets插件

    转行学开发,代码100天——2018-03-31 今天学习了jQuery UI的widgets插件,主要包括accordion插件 accordion插件 该插件表示折叠面板效果,点击头部展开/折叠被 ...

  7. Cookie 记录最后访问时间

    package cn.gs.ly.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.D ...

  8. Python笔记(十四)_永久存储pickle

    pickle模块:将所有的Python对象转换成二进制文件存放 应用场景:编程时最好将大对象(列表.字典.集合等)用pickle写成永久数据包供程序调用,而不是直接写入程序 写入过程:将list转换为 ...

  9. waf学习

    参考文章: http://drops.xmd5.com/static/drops/tips-7883.html waf种类 云waf 传统安全厂商的硬件waf以及一直存在ips,ids设备 主机防护软 ...

  10. shell 删除项目日志

    删除半年之前的日志 find 后面紧跟目录 .为当前目录 -type f 指定查找的是文件 -mtime +180  查找180天之前的 -name  文件名筛选 -exec -rm -rf  执行的 ...