使用Spock 单元测试
一、什么是Spock
Spock 是一个测试框架,甚至可以说是一门语言他是基于Groovy开发的。它的语法完全遵循 BDD(行为驱动开发) 风格的结构。它是基于 Junit test runner 上开发但是又跟 Junit 完成不一样,同时集成了像 Jmock、Mockito 等语法表达风格于一体,使得它很简洁有很高的可读性。
二、Spock 优缺点
语法清晰简单并且有很高的可读性
不好的就是需要学习下Groovy 的语法,对Maven的配置不是很友好。但是在Gradle 中可以很好的支持
三、如何使用Spock
Maven 的配置
- Gmavenplus-plugin 插件可以让你的测试代码支持 Groovy 语法
- Surefire 插件 测试时只执行带有 Spec后缀的代码,这个必须是*Spec.java 而不是 groovy
- spock-core 就是 spock 的核心包
- byte-buddy 用来做动态代理,如果你需要测试的代码没有实现接口。spock 无法帮你mock,当然你也可以用 cliglib 代替
声明类


- /**
- *
- * @author: serio.shi(苦参)
- * @create 2020/08/05 17:22
- * */
- public class User {
- private int id;
- private String name;
- private int age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
Dao 类


- interface UserDao {
- public User get(int id);
- public User findByName(String name);
- public void createUser(User user);
- }
UserService 类


- /**
- *
- * @author: serio.shi(苦参)
- * @create 2020/08/05 17:23
- * */
- public class UserService {
- private UserDao userDao;
- public UserService(UserDao userDao) {
- this.userDao = userDao;
- }
- public User findUser(int id){
- return userDao.get(id);
- }
- public void createUser(User user){
- User existing = userDao.findByName(user.getName());
- if(existing == null){
- userDao.createUser(user);
- } else{
- throw new RuntimeException(String.format("User with name %s already exists!", user.getName()));
- }
- }
- }
测试 service的findUser 方法 mock dao的get 方法返回一个固定 user
是的你没有看错,它的方法名就是一个字符串(它有什么好处后面再讲)。它的语法很简单 given:、when:、then:、
setup 是它的元方法在测试用例执行前调用类似于 @before 。
- given 需要的一些变量参数
- when 就是需要测试的方法
- then 就是期待的结果
1 * dao.get(id) >> new User(id:id, name:"James", age:27)
表示 dao.get(id) 方法将会被调用一次,并且让他返回 new User(id:id, name:"James", age:27) 对象。并且期待它的结果是 result.id == 1、result.name == "James"、result.age == 27
在运行测试后
从图中我们可以看到,我们定义的方法名被打印出来。我们可以很方便的看到我们想要测试的内容成功了。
如果验证没有通过 Spock 将通过图表的方式告诉你哪里出问题,并且它会帮你把两个值的打印出来帮你做对比(经常有小伙伴写测试用例的时候把值打印出来用肉眼来识别错误)。我们把期待的id改为12再来试下。
我们可以看到 Spock 提示你测试用例失败了,你的id 是1而期待的是12,当你点击 <Click to see difference> 的时候将会弹出一个框帮你做数据对比。简直是开发神器啊有木有!!!
Spock 还有一个神奇的参数化测试,类似于表格的形式填入参数和期待的结果
我们先在UserService类中加上以下代码:


- Map datatable = [1:"jerry", 2:"tom", 3:"tommy", 4:"jack"]
- public String getUser(int id){
- return datatable.get(id)
- }
添加测试用例:
- def "spock parameterized test demo"(){
- expect:
- service.getUser(id) == name
- where: "some id with name"
- id || name
- 1 || "jerry"
- 2 || "tom"
- 3 || "tommy"
- 4 || "jack"
- }
可以看到我们可以以更清晰的方式把入参跟结果描述出来,运行结果:
当前它还有很多的姿势待我们去解锁,本文只举例了简单的案例。
更多详情点击:http://spockframework.org/spock/docs/1.3/all_in_one.html#_introduction
四、小结
Spock 有着依赖少、运行快、语法简单、代码清晰等特点、本文只做简单的举例用于学习和记录
使用Spock 单元测试的更多相关文章
- Groovy+Spock单元测试
一.导入依赖 Spock是基于JUnit的单测框架,提供一些更好的语法,结合Groovy语言,可以写出更为简洁的单测. <!-- groovy依赖 --> <dependency&g ...
- SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(下)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续上一节,继续使用 spock 测试我们自己封装的 WebClient 测试针对 r ...
- SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(上)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们来测试下前面封装好的 WebClient,这里开始,我们使用 spock 编写 gro ...
- 运用Spock编写高质量单元测试
单元测试作为提升代码质量的有效方法,目前在国内各大互联网公司的开发团队中,尤其是业务团队中却鲜少被使用.这主要由于大家对于单元测试有一些认知错误,或者没有正确的打开方式.至今我们团队在小剧场.零代码运 ...
- Groovy单元测试框架spock数据驱动Demo
spock是一款全能型的单元测试框架. 上次文章分享了spock框架的基础功能的使用,在此基础上,我根据自己写的Groovy的封装方法.数据驱动以及一些Groovy的高级语法做了一些尝试.发现还是有一 ...
- Groovy单元测试框架spock基础功能Demo
spock是一款全能型的单元测试框架. 最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock.由于本身使用Groovy的原因,比较钟 ...
- Maven和Gradle中配置单元测试框架Spock
Maven Maven本身不支持其他JVM语言(例如Groovy或Scala).要在Maven项目中使用它,需要使用第三方插件.对于Groovy而言,最好的选择似乎是GMavenPlus(重写不再维护 ...
- 使用Groovy+Spock构建可配置的订单搜索接口测试用例集
概述 测试是软件成功上线的安全网.基本的测试包含单元测试.接口测试.在 "使用Groovy+Spock轻松写出更简洁的单测" 一文中已经讨论了使用GroovySpock编写简洁的单 ...
- Java单元测试框架 JUnit
Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...
随机推荐
- 最短路——Floyd算法
Folyd算法求最短路 介绍: Folyd算法是用来求带权图中每两点之间的最短路的动态规划算法,(它每次求得的值都可以在后面使用).该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学 ...
- C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)
问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中 变量赋值其他变量报错? public class TestClass{ public TestClass() { } pu ...
- js 分享QQ、QQ空间、微信、微博
//分享QQ好友 function qq(title,url,pic) { var p = { url: 'http://test.qicheyitiao.com',/*获取URL,可加上来自分享到Q ...
- J.U.C体系进阶(一):juc-executors 执行器框架
Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! 主要内容: juc-executors 执行器框架 juc-locks 锁框架 ...
- 记一次webpack打包的问题
记一次webpack打包的问题 在webpack打包中开启了webpack-bundle-analyzer,发现了一个chunk:tinymce  在整个项目中查找,只有一个未被使用的组件中有如下代 ...
- webpack源码-打包资源输出到本地
webpack收集完依赖是怎么打包资源的呢? 入口compiler.js: this.applyPluginsParallel("make", compilation, err = ...
- P1100 高低位切换
这个题很简单 直接用左移位(<<)和右移位(>>)就可以过了 #include<iostream> #include<cstdio> using nam ...
- react实战 : 用矩阵思想做一个自适应布局容器组件
需求是这样的. 有一个需要显示若干方块型元素的小区域 数量比较少的时候显示一排 数量比较多的时候显示两排 用 grid 不好,因为当数量为奇数的时候需要两排里面的元素都乖乖的居中显示. 用 flex ...
- 3.新手建站教程系列之认识WordPress和第一篇文章
上一期咱已经把本地环境和wp网站给搭建出来了,接下来就是来认识这个程序了.进入网站后台,地址为你的网址/wp-admin 后台名字叫做仪表盘,首页是一个信息合集区域,上面会显示有多少文章,多少页面以及 ...
- JQuery对下拉列表Select的一些操作
1.假如select中存在选项,需要清空的情况: $("#search").find("option").remove(); $("#search&q ...