Spock测试框架如何Mock静态方法
1. 问题场景
在写单元测试时,难免会遇到需要Mock的静态方法。当使用Spock测试框架时,Spock提供Moc静态方法Mock只支持Groovy语言,无法支持Java语言实现的静态方法Mocking Static Methods。
2. 解决方案
基于Spock测试框架的单元测试可以使用PowerMock或Mockito Mock静态方法。目前
spock-1.x mock静态方法使用的是powermock,2.x之后使用Mockito-3.4及更新版本。
3. 实现步骤
由于作者采用的是Spock 2.1-groovy-3.0,因此接下来的实现步骤是基于Mockito的。
- 步骤1:Gradle引入依赖
// 引入Spock测试框架
testImplementation("org.codehaus.groovy:groovy:3.0.9")
testImplementation("org.spockframework:spock-bom:2.1-groovy-3.0")
testImplementation("org.spockframework:spock-core:2.1-groovy-3.0")
testImplementation("org.spockframework:spock-spring:2.1-groovy-3.0")
testImplementation("org.spockframework:spock-junit4:2.1-groovy-3.0") //引入Mockit
testImplementation("org.mockito:mockito-core:4.3.1")
testImplementation("org.mockito:mockito-inline:4.3.1")
- 步骤2:Mock静态方法
静态方法示例:
public class IDGenerator {public static String nextId() {//通过网络获得IDString id = "xxxxx";return id;}
}@Getter
@Setter
public class StudentPO {private String id;private String name;private String code;public static Student create(String name, String code) {setId(IDGenerator.nextId());setName(name);setCode(code);}
}
这里边由于IDGenerator通过网络获得唯一ID(如分布式ID中心),因此为了提高单元测试的效率,需要Mock IDGenerator。
// 使用Groovy语言开发
class StudentTest extends Specification {Mockito.mockStatic(IDGenerator.class)def "should success when create student"() {given:var name = "tester"var code = "123456"Mockito.when(IDGenerator.nextId()).thenReturn("123456789")when:var student = Student.create(name, code)then:student.getId() == "123456789"}
}
4. FAQ
- static mock is already registered in the current thread
原因分析:在运行测试用例的线程中Mock同一个静态方法多次
解决方案:
// groovy语言编写
class StudentTest extends Specification {MockedStatic<IDGenerator> generatordef setup() {generator = Mockit.mockStatic(IDGenerator.class)}// 测试用例def cleanup() {// 清除Mock的静态方法generator.close()}
}
Spock测试框架如何Mock静态方法相关推荐
- Spock测试框架浅尝
文章目录 0. 写在前面 1. 为什么要进行单元测试? 1.1 什么是单元测试? 1.2 单元测试的几个好处 2. Spock框架介绍 2.1 规范 Specification 夹具方法 Fixtur ...
- spock测试框架使用指北
文章目录 一.Spock是什么 二.Spock,Junit,Jmock以及PowerMock区别 三.Spock项目引用配置 1. POM版本依赖 2. 新建测试用例 3. 执行单元测试 四.Spoc ...
- Spock测试框架中的注解使用
@Share 在测试类中,Share标记的变量可以在不同的测试方法中使用. Spock中的测试方法注解 @Ignore 忽略 忽略测试方法 @IgnoreRest 忽略其他 忽略其他测试方法 @Unr ...
- groovy测试框架-Spock入门
简介 为什么要用Spock 一.入门 1.1 依赖引入 1.2.定义一个Spock测试类 1.3一个简单的测试方法 1.4With与VerifyAll 二.Mock 三.Mock,stub,spy 四 ...
- java的mock测试框架
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- BDD测试框架Spock概要
前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...
- 高质量的单元测试 Spock单元测试框架详讲
文章目录 方法篇 为什么需要单元测试 单元测试的定义 单元测试与其他测试的区别 单元测试的作用 关于单元测试的成本 如何写好单元测试 什么场景适合单元测试 单元测试的粒度 关于TDD TDD的三定律 ...
- 吃透单元测试:Spock单元测试框架的应用与实践
一,单元测试 单元测试是对软件基本组成单元进行的测试,如函数或一个类的方法.程序是由函数组成的,每个函数都要健壮,这样才能保证程序的整体质量.单元测试是对软件未来的一项必不可少的投资."具体 ...
- Spring MVC测试框架
原文链接:http://jinnianshilongnian.iteye.com/blog/2004660 Spring MVC测试框架详解--服务端测试 博客分类: springmvc杂谈 spri ...
最新文章
- ETSI — MEC — APIs 清单
- python 如何用指数函数拟合数据?(2020年新型冠状病毒感染人数预测)
- 设置html按钮点击事件无效果,css怎么设置按钮不能点击?
- ffmpeg实战教程(六)Android CMake实现解码(MP4转YUV)
- 【Java】进制转换器的实现
- BootStrap FileInput 插件实现多文件上传前端功能
- 【心里效应】98 个著名的心理效应
- mujoco_py中文文档
- 个人云盘:阿里云无影,百度网盘、腾讯微云争霸?
- 如何将图片批量压缩大小?怎样一次性压缩多张图片?
- 安装、选择-如何制作U盘系统盘以及U盘安装操作系统的方法 -by小雨
- LaTex(PART IV) 各级标题
- 设计模式之 Vistor 访问者模式:Swift 实现
- Model和ModelMap的关系
- 前端调用微信扫一扫不触发事件,没有任何反应
- 0x80004005
- What’s the value created by bitcoin?
- 各种JSON技术对比(Json-lib,Jackson,Gson,Fastjson)
- Windows 10 打印机驱动无法删除和卸载的解决办法
- 交换机日志删除_如何查看交换机报警日志 并导出日志 命令是什么
热门文章
- 关于百度api地图中中文乱码的处理
- 国外新闻网站发稿有多重要?这些步骤和注意事项要知道
- 【Nacos在derby模式下密码忘记】使用derby的ij工具重置密码/修改密码
- 中国传媒大学计算机学院地址,中国传媒大学有几个校区及校区地址 哪个校区最好...
- e = e || window.event用法细节讨论
- 我们都是干柴,期待烈火!
- 学习说话人识别和验证的判别特征
- 名人故事之 Philip Katz
- 控制教程 —— 介绍篇:8.基于Simulink为火车系统建模
- 如何去掉/消除网页复制粘贴后带到word或WPS文档中的浅灰色背景