Mock的作用
问题
一,程序的结果判定。
1,第一步,程序编译完成之后,可以运行。第二步,与业务功能对接,在网站上进行操作,没有问题。
第一步是基础可以忽略,为了解决第二步,我们便需要测试类。
二,测试时的问题。
1,仅仅走一步测试,需要运行程序,搭建环境,耗费资源大。
2,硬件环境搭建不到位,如需要一个接口的温度参数,但是开发时,硬件还没有到位。
3,数据敏感问题,测试需要开放数据库,但一部分数据,我们不想公开。
Mock模拟对象就是为了解决这些问题,它模拟各种接口对象,作为一个假对象,帮助我们耗费较少资源完成测试操作。
MockMvc
问题
1,解决网络慢问题,不依赖网络环境
是Mock中的一部分,模拟Http请求,对Controller层进行调用。
具体使用
环境:SpringBoot
引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
需要测试的的controller层
/**
* 控制器
*
* @author
* @version V1.0
* @since 2020/7/1 11:00
**/
@Api(tags = "管理控制器") //生成接口文档
@RestController
@RequestMapping("/test")
public class controller {
@Autowired
private Service service;
@GetMapping(value = "/get")
public String controlleTest(String str){
String result = service.getInfo(str)
return result;
}
}
测试类方法对象的构建
公共方法的构建
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
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.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
/**
* 功能模块测试
* @author
* @Description :
* @date 2020年7月21日下午3:41:46
*/
//springboot中的Junit方法
@RunWith(SpringRunner.class)
//springboot中的启动类
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
@Slf4j
public class ControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
private String token ;// 获取系统登录权限
//实例化mockMvc对象
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
// 获取系统登录权限
token = loginService.login("user", "password");
}
//获取登录人的权限
@Resource
private loginService loginService;
}
具体的测试类方法
对增删改查4类方法的具体测试
/**
*
* @author
* @Description :入库功能测试
* @date 2020年7月21日下午5:33:30
* @throws Exception
* @param
id: 1 标识
status: 1
useId: 用户ID
*
*/
@Test
public void testSave() throws Exception {
//入库方法具体路径
mockMvc.perform(MockMvcRequestBuilders.post(new URI("/test/save"))
.param("id", "1")
.param("status", "1")
.param("useId", "f59b086eb5744295abcb6a1277945819")
.header("Authorization", "Bearer "+token+"")//添加头部获取登录系统权限
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
/**
*
* @author
* @Description : 查询功能测试
* @date 2020年7月21日下午3:46:17
//查询条件
conditions : {" time":"2020-07-15",
"isMine":"0",
"status":"0",
"search":"潘丽丽" }
//查询条件说明
time:时间 YYYY-MM-dd
status:全部 0;已答应:1;未答应 2;未通知 3
search: ID或者名称搜索
*/
@Test
public void testGet() throws Exception {
String conditions = " {\"time\":\"2020-07-17\",\"isMine\":\"1\",\"status\":\"0\",\"search\":\"潘丽丽\"}";
mockMvc.perform(MockMvcRequestBuilders.get(new URI("/test/get"))
.param("conditions", conditions)
.header("Authorization", "Bearer "+token+"")
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
/**
*
* @author
* @Description : 更新功能测试
* @date 2020年7月21日下午4:48:44
* @throws Exception
@param
* id: 1 标识
status: 1
useId: 用户ID
*
*/
@Test
public void testUpate() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.put(new
URI("/test/update"))
.param("id", "1")
.param("status", "40")
.param("useId", "f59b086eb5744295abcb6a1277945819")
.header("Authorization", "Bearer "+token+"")
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
/**
*
* @author
* @Description : 删除功能测试
* @date 2020年7月21日下午4:48:44
* @throws Exception
@param
* id: eda8902495ac4cbca102986e2bbb41ad 标识
*
*/
@Test
public void testDelete() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.delete("/test/delete")
.param("id", "eda8902495ac4cbca102986e2bbb41ad")
.header("Authorization", "Bearer "+token+"")//添加头部获取登录系统权限
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print());
}
测试结果说明
//验证的结果
//可以跟实际结果比较
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"10"]
Content type = application/json;charset=UTF-8
Body = ["姓名","张三","性别","男"]
Forwarded URL = null
Redirected URL = null
Cookies = []