springboot使用MockMvc测试controller
通常,在我们平时开发项目时,如果想要输入URL对Controller进行测试,在代码编辑之后,需要重启服务器,建立http client进行测试。这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。
下面就写几个简单的案例,使用MockMvc测试Controller中的get请求和post请求。
1.引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.编写测试controller
/**
* @author Sue
* @create 2019-09-06 10:03
**/
@RestController
@RequestMapping("/mock")
public class MockmvcController { /**
* get请求
* @param username
* @param password
* @return
*/
@GetMapping("/getInfo")
public R getInfo(String username,String password){
System.out.println("username:" + username + "," + "password:" + password);
return R.ok();
} /**
* post请求
* @param username
* @param password
* @return
*/
@PostMapping("/getInfo2")
public R getInfo2(String username,String password){
System.out.println("username:" + username + "," + "password:" + password);
return R.ok();
} /**
* post请求接收json格式
* @param user
* @return
*/
@PostMapping("/getInfo3")
public R getInfo3(@RequestBody User user){
System.out.println(user);
return R.ok(user);
} }
3.创建单元测试
idea使用快捷键ctrl+alt+t
@RunWith(SpringRunner.class)
@SpringBootTest
public class MockmvcTest {
// 注入web环境的ApplicationContext容器
@Autowired
private WebApplicationContext context;
/**
* 模拟mvc测试对象
*/
private MockMvc mockMvc; /**
* 所有测试方法执行之前执行该方法
*/
@Before // 这个注解的作用,在每个方法之前都会执行一遍
public void before() throws Exception {
//获取mockmvc对象实例
mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
} @Test
public void getInfo() throws Exception {
MvcResult mvcResult = mockMvc.perform(
MockMvcRequestBuilders.get("/mock/getInfo")
.param("username", "Jack")
.param("password", "Jack001"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print()).andReturn();
System.out.println("输出 " + mvcResult.getResponse().getContentAsString());
} @Test
public void getInfo2() throws Exception {
MvcResult mvcResult = mockMvc.perform(
MockMvcRequestBuilders.post("/mock/getInfo2")
.accept(MediaType.APPLICATION_JSON)
.param("username", "Jack")
.param("password", "Jack001"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print()).andReturn();
System.out.println("输出 " + mvcResult.getResponse().getContentAsString());
} @Test
public void getInfo3() throws Exception {
User user = new User();
user.setUsername("Jack");
user.setPassword("Jack001");
String jsonString = JSON.toJSONString(user);
MvcResult mvcResult = mockMvc.perform(
MockMvcRequestBuilders.post("/mock/getInfo3")
.contentType(MediaType.APPLICATION_JSON)
.content(jsonString)
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print()).andReturn(); int status = mvcResult.getResponse().getStatus();
Assert.assertTrue("正确", status == 200); System.out.println("输出 " + mvcResult.getResponse().getContentAsString());
} }
4.测试
代码解析 :
perform
:执行一个RequestBuider
请求,自动执行SpringMvc
的流程并映射到相应的控制器执行处理get
: 声明一个发送get
请求的方法.public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) { return new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars);}
这是个静态方法,可以直接导入,根据uri模版和uri的变量值得到一个get
请求的方法. 另外提供了其他的请求方法, 如:post
、put
、delete
等.andExperct
: 添加ResultMatcher
验证规则,验证perform
执行完成后的结果是否正确(对返回的数据进行判断)andDo
: 添加ResultHandler
结果处理器,比如调试打印结果到控制台print()
andReturn
: 最后返回相应的MvcResult
,然后进行自定义验证/进行下一步的异步处理.
整个测试过程如下:
1、准备测试环境
2、通过MockMvc执行请求
3、添加验证断言
4、添加结果处理器
5、得到MvcResult进行自定义断言/进行下一步的异步请求
6、卸载测试环境
通过这几个方法,相信大家对mockMvc测试有了一些了解,如果想要使用更多细节,通过方法名和参数应该也能看懂方法含义,如果还是不能理解,可以查看下面的官方文档配合使用。
springboot使用MockMvc测试controller的更多相关文章
- springboot利用MockMvc测试controller控制器
主要记录一下控制器的测试,service这些类测试相对简单些(可测试性强) API测试需求比较简单: ① 需要返回正确的http状态码 200 ② 需要返回json数据,并且不能返回未经捕获的系统异常 ...
- 使用MockMvc测试controller
之前我们测试controller的时候仅仅是作为一个pojo来进行简单的测试,spring3.2后我们可以按照控制器的方式来测试Spring MVC的controller了,这样的话在测试控制器的时候 ...
- SpringBoot使用MockMVC单元测试Controller
对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络 ...
- spring-mvc springboot 使用MockMvc对controller进行测试
网上基本都是参考官方的使用方式,使用了import static,个人感觉这种方式特别不好,代码提示性不友好.所以在此进行说明,也方便自己以后使用. 1. 引入spring-test相关jar包,sp ...
- springmvc中使用MockMvc测试controller
示例代码 import com.alibaba.fastjson.JSONObject; import org.junit.Before; import org.junit.Test; import ...
- Mockito 结合 Springboot 进行应用测试
Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring Boot可以跟BDD(Behavier Driven ...
- Spring MVC如何测试Controller(使用springmvc mock测试)
在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...
- spring boot(三)Junit 测试controller
Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法 一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期 ...
- Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用
==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...
随机推荐
- error: (-215) !empty() in function detectMultiScale
tips: pip install opencv-python or https://www.lfd.uci.edu/~gohlke/pythonlibs/ 原因确实是找不到 opencv 的 xml ...
- AIX系统的备份和恢复
1.AIX备份命令
- Shiro(二)
1 Shiro的授权 1.1 授权流程 1.2 授权方式 shiro支持三种方式的授权 1.2.1 编程式 通过编写if/else完成授权代码. if(subject.hasRole("ro ...
- share point 字段类型
Type (as shown on the Create Column page) Field Type Notes MSDN Links Single line of text Type=”Text ...
- encode()和decode()两个函数
编码可以将抽象字符以二进制数据的形式表示,有很多编码方法,如utf-8.gbk等,可以使用encode()函数对字符串进行编码,转换成二进制字节数据,也可用decode()函数将字节解码成字符串:用d ...
- 【leetcode】1202. Smallest String With Swaps
题目如下: You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] ...
- 17.树的子结构(python)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution: def HasSubtree(self, pRoot1, pRoo ...
- 2019春Python程序设计作业2(0326--0401)
1-1 已知st="Hello World!",使用print(st[0:-1])语句可以输出字符串变量st中的所有内容. (2分) T F 1-2 Python程 ...
- 游标定位:Cursor类
关于 Cursor Cursor 是每行的集合. 使用 moveToFirst() 定位第一行. 你必须知道每一列的名称. 你必须知道每一列的数据类型. Cursor 是一个随机的数据源. 所有的数据 ...
- 51 Nod 1678 lyk与gcd(容斥原理)
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作 ...