本章节主要讲解以下两部分内容:

1、Mock 测试简介

2、测试用例演示

一、Mock 测试简介

1、什么是 mock 测试

在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个「虚拟的对象」来创建以便测试的测试方法,就是 「mock 测试」在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个「虚拟的对象」来创建以便测试的测试方法,就是mock 测试。

虚拟的对象就是 mock 对象。

mock 对象就是真实对象在调试期间的代替品。

2、为什么使用 mock 测试

避免开发模块之间的耦合

轻量、简单、灵活

3、MockMVC 介绍

基于 RESTful 风格的 SpringMVC 的测试,我们可以测试完整的 Spring MVC 流程,即从 URL 请求到控制器处理,再到视图渲染都可以测试。

1)MockMvcBuilder

MockMvcBuilder 是用来构造 MockMvc 的构造器,其主要有两个实现:StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder,对于我们来说直接使用「静态工厂 MockMvcBuilders 创建」即可。

2)MockMvcBuilders

负责创建 MockMvcBuilder 对象,有两种创建方式:

standaloneSetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了。

「webAppContextSetup」(WebApplicationContext wac):指定 WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的 MockMvc,本章节下面测试用例均使用这种方式创建 MockMvcBuilder 对象。

3)MockMvc

对于服务器端的 SpringMVC 测试支持主入口点。通过 MockMvcBuilder 构造 MockMvcBuilder 由 MockMvcBuilders 建造者的静态方法去建造。

核心方法:perform(RequestBuilder rb) -- 执行一个 RequestBuilder 请求,会自动执行 SpringMVC 的流程并映射到相应的控制器执行处理,该方法的返回值是一个 ResultActions。

4)ResultActions

(1)「andExpect」:添加 ResultMatcher 验证规则,验证控制器执行完成后结果是否正确;

(2)「andDo」:添加 ResultHandler 结果处理器,比如调试时打印结果到控制台;

(3)「andReturn」:最后返回相应的 「MvcResult」;然后进行自定义验证 / 进行下一步的异步处理;

5)MockMvcRequestBuilders

用来构建请求的,其主要有两个子类 「MockHttpServletRequestBuilder *和」MockMultipartHttpServletRequestBuilder*(如文件上传使用),即用来 Mock 客户端请求需要的所有数据。

6)MockMvcResultMatchers

(1)用来匹配执行完请求后的「结果验证」

(2)如果匹配失败将抛出相应的异常

(3)包含了很多验证 API 方法

7)MockMvcResultHandlers

(1)结果处理器,表示要对结果做点什么事情

(2)比如此处使用 MockMvcResultHandlers.print() 输出整个响应结果信息

8)MvcResult

(1)单元测试执行结果,可以针对执行结果进行「自定义验证逻辑」

二、测试用例演示

1、添加依赖

<!-- spring 单元测试组件包 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.7.RELEASE</version>
</dependency>
<!-- 单元测试Junit -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>
<!-- Mock测试使用的json-path依赖 -->
<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.2.0</version>
</dependency>

前两个 jar 依赖我们都已经接触过了,对于返回视图方法的测试这两个 jar 依赖已经足够了,第三个 jar 依赖是用于处理返回 Json 数据方法的,这里要明白每个 jar 的具体作用。

2、被测试的方法

@RequestMapping(value ="editItem")
public String editItem(Integer id, Model model) {
Item item = itemService.getItemById(id);
model.addAttribute("item", item);
return"itemEdit";
}
@RequestMapping(value ="getItem")
@ResponseBody
public Item getItem(Integer id) {
Item item = itemService.getItemById(id);
returnitem;
}

这里我们提供了两个方法,一个是返回视图的方法,另一个是返回 Json 数据的方法,下面我们会给出测试类,分别对这两个方法进行测试。

3、测试类:ItemMockTest

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="classpath:spring/*.xml")
@WebAppConfiguration
public class ItemMockTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public voidinit() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
}

这里前两个注解就不再解释了,我们在学习 Spring 与 Junit 整合的时候已经讲解过了,这里说一下第三个注解:@WebAppConfiguration:可以在单元测试的时候,不用启动 Servlet 容器,就可以获取一个 Web 应用上下文。

1)返回视图方法测试

@Test
public voidtest() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/editItem").param("id","1"))
.andExpect(MockMvcResultMatchers.view().name("itemEdit"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
Assert.assertNotNull(result.getModelAndView().getModel().get("item"));
}

这三句代码是我们对结果的期望,最后打印出了结果,说明执行成功,所有期望都达到了,否则会直接报错。从结果中我们就可以看到这个请求测试的情况。

2、返回 Json 数据方法

@Test
public void test1() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/getItem")
.param("id","1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value("IPhone X"))
.andDo(MockMvcResultHandlers.print())
.andReturn();
}

在这个方法中比较特殊的就是设置 MediaType 类型,因为都是使用 Json 格式,所以设置了 MediaType.APPLICATION_JSON,jsonPath 用于比对期望的数据是否与返回的结果一致,这里需要注意的是 "$.id" 这 key 的种形式。

三、小结

这里只是用到了 MockMvc 很小一部分知识,更加深入学习会使你养成一种良好编写单元测试的习惯,这是十分难得的一种好习惯,推荐去看官方文档,然后动手去测试一下,为你编写的每一个 Controller 方法进行测试,保证他们的可靠性。

idea junit 测试看不到控制台报错信息_高手都这么给 Spring MVC 做单元测试!相关推荐

  1. shell 获取ora报错信息_带你了解企业是如何编写脚本的-第2篇:Shell脚本规范

    在带你了解企业是如何编写脚本的-第一篇:认识脚本这篇文章中,我对脚本进行了一些基本的讲解,那么今天我们就来了解一下Shell脚本有哪些规范(约定俗成). 俗话说无规矩不成方圆,想要长远的发展就需要制定 ...

  2. shell 获取ora报错信息_频发:故障排除之又见 ORA-4031丨云和恩墨技术通讯

    亲爱的读者朋友: 为了及时共享行业案例,通知共性问题,达成共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>,通过对过去一段时间的知识回顾,故障归纳,以期提供有价值的信息供大家参考.同时 ...

  3. Yii框架控制台报错: The id configuration for the Application is required

    一.背景 博主新接手的项目是使用Yii框架开发的,在使用yii的控制台命令的时候报错:The "id" configuration for the Application is r ...

  4. 控制台报错For input string: ““、empty String

    问题介绍:这几天做东西总是遇到两个问题:控制台报错For input string: "".empty String 背景:虽然不耽误正常使用swagger,但是看着贼烦,而且随着 ...

  5. 控制台报错:Unknown database ‘xxxxx‘

    原文链接: 原文链接:https://www.yujizhu.com/public/18_mysql控制台报错UnknownDatabase/#more 一.问题描述:Unknown database ...

  6. 四种解决Vue中重复点击相同路由控制台报错问题( Avoided redundant navigation to current location)

    vue-router 升级到3.1.x 后,重复点击导航时,控制台出现报错 ,虽然不影响功能使用,但是看的就不舒服. 报错信息 Uncaught (in promise) NavigationDupl ...

  7. 【解决】控制台报错Uncaught TypeError: Object(...) is not a function at eval (vue-router.esm-bundler.js

    打开http://localhost:8080/,控制台报错 Uncaught TypeError: Object(...) is not a functionat eval (vue-router. ...

  8. Invalid component name: “Home,“. Component names should conform to valid custom element。。。控制台报错

    [Vue warn]: Invalid component name: "News,". Component names should conform to valid custo ...

  9. 运行Equinox控制台报错Could not find bundle: org.eclipse.equinox.console

    我对Java的每一种技术都感兴趣,尤其是在了解到OSGi时,虽然这几年无人问津,但是我决定去学习一下,买了一本周志明编著的<深入理解OSGi---Equinox原理.应用于最佳实践>一书, ...

最新文章

  1. 重磅 ! Redis+Nginx+JVM+设计模式+Spring全家桶+Dubbo
  2. 雷观(十七):想拉人入伙,合伙创业,请拿出一点认真的态度
  3. android studio安装在其他盘,Android Studio配置移动到D盘(亲测)
  4. Thread.sleep() SystemClock.sleep()
  5. Hadoop源码分类概要整理
  6. 论ORM之EFCore初篇(快速基于本地数据库实现数据操作)
  7. 自定义 View 循环滚动刻度控件
  8. 三维数组设置索引_python3三维数据结构 —— panel
  9. Python中dir,hasattr,getattr,setattr,vars的使用
  10. jsonarray转化list对象_第8篇:Cython的面向对象--Python类 vs Cython扩展类
  11. 【买衣服】I'm looking for a jacket
  12. vagrant 的安装与使用
  13. android listview优化,Android ListView 详解及其优化
  14. 高频交揭密美五大高交商访谈录
  15. TechNet中文网络广播office系列视频教程下载(一)(2007-02-28 09:18:18) 分类:Office...
  16. wmp.dll 自动注册失败
  17. iphone 信号对应设备_如何访问iPhone的现场测试模式(并查看实际信号强度)
  18. USTC English Club20171010
  19. crc16-ccitt算法c语言,CRC-CCITT 标准CRC16(1021) 算法校验类
  20. ijkplayer环境搭建

热门文章

  1. springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较
  2. typeof 数据类型转换
  3. java 复制字段_java - 在构造函数中按字段复制字段 - 我需要一个更简洁的形式 - SO中文参考 - www.soinside.com...
  4. linux适应环境,Linux从入门到适应(一):VSCode C++环境配置
  5. 批量删除HTML链接软件,3种方法教你一次性删除word文档中的所有超链接
  6. PHP Calendar 函数,wordpress函数get_calendar()用法示例
  7. 一调计算机专业综合理论试卷,一调计算机专业综合理论试卷(盐城)(新编)
  8. Android studio下载安装使用遇到的问题及解决办法
  9. esxi 修改服务器配置失败,R720服务器安装 ESXI 5.5update1后出现XXX错误
  10. ais文件还原到mysql_SQLSERVER 数据库可疑的解决步骤