Spock 是非常简洁规范的单元测试框架,网上很多资料都不齐全,例子也很难懂。我自己经过一段时间的学习,梳理了这篇文章,不仅讲解层次递进,而且还有非常简洁明了的例子,小白都能懂!
快速入门 Spock
使用 Spock 非常简单,只需要引入对应的 Spock 依赖包就可以写 Spock 单测代码了。下面我将演示一个使用 Spock 进行单测的最小项目,帮助大家最快上手 Spock。本文档所有例子可在 Github 项目中找到,地址:chenyurong/quick-start-of-spock: 深入浅出 Spock 单测
首先,我们使用 Spring Initializr 初始化一个项目,不需要引入任何依赖应用,这里我命名为 quick-start-of-spock。项目初始化完成之后,在 pom.xml 文件中添加 Spock 依赖,如下代码所示。
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.2-groovy-2.4</version>
</dependency>
接着,我们编写一个计算器类,用来演示 Spock 单测的使用,代码如下所示。
package tech.shuyi.qsos
public class Calculator {
public int add(int num1, int num2) {
return num1 + num2;
}
public int sub(int num1, int num2) {
return num1 - num2;
}
public int mul(int num1, int num2) {
return num1 * num2;
}
public int div(int num1, int num2) {
return num1 / num2;
}
}
接着,我们为 Calculator 生成一个测试类,放在 test 目录下即可,名称命名为 CalculatorTest.groovy,代码如下所示。
package tech.shuyi.qsos
import spock.lang.Specification
class CalculatorTest extends Specification {
Calculator calculator = new Calculator()
def "test add method, 1 add 1 should equals 2."() {
given: "init input data"
def num1 = 1
def num2 = 1
when: "call add method"
def result = calculator.add(num1, num2)
then: "result should equals 2"
result == 2
}
def "test sub"() {
expect:
calculator.sub(5, 4) == 1
}
def "test mul"() {
expect:
calculator.mul(5, 4) == 20
}
def "test div"() {
when:
calculator.div(1, 0)
then:
def ex = thrown(ArithmeticException)
ex.message == "/ by zero"
}
}
这个测试类中,针对 Calculator 类的 4 个加减乘除方法都配置了对应的单测用例。到这里,Spock 的代码就编写完成了。我们直接点击 CalculatorTest 类左边的运行按钮即可运行整个单测用例,如下图所示。

正常情况下,所有单测用例都应该通过测试,都显示绿色的图标,如下图所示。

我们还可以用来计算一下单测覆盖率,运行入口如下图所示。

点击运行之后,会弹出单测覆盖率结果,我这里对所有方法都覆盖了,因此覆盖率是 100%,如下图所示。

到这里,一个最小单元的 Spock 示例项目就结束了。
Spock 语法块
对于 Spock 来说,其最大的特点是使用 give-when-then 等结构来规范了单测的写法,这也是一种非常好的单测规范。因此,了解 Spock 的语法块,知道每个关键词代表的意思就显得非常重要了。
基础语法
对于 Spock 来说,最常用的几个语法块关键词有:
given
when
then
and
expect
given
given 代码块通常用来进行数据准备,以及准备 mock 数据。例如上面计算器加法单测的例子:
def "test add method, 1 add 1 should equals 2."() {
given: