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

  1. 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静态方法相关推荐

  1. Spock测试框架浅尝

    文章目录 0. 写在前面 1. 为什么要进行单元测试? 1.1 什么是单元测试? 1.2 单元测试的几个好处 2. Spock框架介绍 2.1 规范 Specification 夹具方法 Fixtur ...

  2. spock测试框架使用指北

    文章目录 一.Spock是什么 二.Spock,Junit,Jmock以及PowerMock区别 三.Spock项目引用配置 1. POM版本依赖 2. 新建测试用例 3. 执行单元测试 四.Spoc ...

  3. Spock测试框架中的注解使用

    @Share 在测试类中,Share标记的变量可以在不同的测试方法中使用. Spock中的测试方法注解 @Ignore 忽略 忽略测试方法 @IgnoreRest 忽略其他 忽略其他测试方法 @Unr ...

  4. groovy测试框架-Spock入门

    简介 为什么要用Spock 一.入门 1.1 依赖引入 1.2.定义一个Spock测试类 1.3一个简单的测试方法 1.4With与VerifyAll 二.Mock 三.Mock,stub,spy 四 ...

  5. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  6. BDD测试框架Spock概要

    前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...

  7. 高质量的单元测试 Spock单元测试框架详讲

    文章目录 方法篇 为什么需要单元测试 单元测试的定义 单元测试与其他测试的区别 单元测试的作用 关于单元测试的成本 如何写好单元测试 什么场景适合单元测试 单元测试的粒度 关于TDD TDD的三定律 ...

  8. 吃透单元测试:Spock单元测试框架的应用与实践

    一,单元测试 单元测试是对软件基本组成单元进行的测试,如函数或一个类的方法.程序是由函数组成的,每个函数都要健壮,这样才能保证程序的整体质量.单元测试是对软件未来的一项必不可少的投资."具体 ...

  9. Spring MVC测试框架

    原文链接:http://jinnianshilongnian.iteye.com/blog/2004660 Spring MVC测试框架详解--服务端测试 博客分类: springmvc杂谈 spri ...

最新文章

  1. ETSI — MEC — APIs 清单
  2. python 如何用指数函数拟合数据?(2020年新型冠状病毒感染人数预测)
  3. 设置html按钮点击事件无效果,css怎么设置按钮不能点击?
  4. ffmpeg实战教程(六)Android CMake实现解码(MP4转YUV)
  5. 【Java】进制转换器的实现
  6. BootStrap FileInput 插件实现多文件上传前端功能
  7. 【心里效应】98 个著名的心理效应
  8. mujoco_py中文文档
  9. 个人云盘:阿里云无影,百度网盘、腾讯微云争霸?
  10. 如何将图片批量压缩大小?怎样一次性压缩多张图片?
  11. 安装、选择-如何制作U盘系统盘以及U盘安装操作系统的方法 -by小雨
  12. LaTex(PART IV) 各级标题
  13. 设计模式之 Vistor 访问者模式:Swift 实现
  14. Model和ModelMap的关系
  15. 前端调用微信扫一扫不触发事件,没有任何反应
  16. 0x80004005
  17. What’s the value created by bitcoin?
  18. 各种JSON技术对比(Json-lib,Jackson,Gson,Fastjson)
  19. Windows 10 打印机驱动无法删除和卸载的解决办法
  20. 交换机日志删除_如何查看交换机报警日志 并导出日志 命令是什么

热门文章

  1. 关于百度api地图中中文乱码的处理
  2. 国外新闻网站发稿有多重要?这些步骤和注意事项要知道
  3. 【Nacos在derby模式下密码忘记】使用derby的ij工具重置密码/修改密码
  4. 中国传媒大学计算机学院地址,中国传媒大学有几个校区及校区地址 哪个校区最好...
  5. e = e || window.event用法细节讨论
  6. 我们都是干柴,期待烈火!
  7. 学习说话人识别和验证的判别特征
  8. 名人故事之 Philip Katz
  9. 控制教程 —— 介绍篇:8.基于Simulink为火车系统建模
  10. 如何去掉/消除网页复制粘贴后带到word或WPS文档中的浅灰色背景