Spock 是基于 Groovy 的 BDD 测试框架,适用于 Java 项目,需添加 spock-core 依赖并支持 Groovy 源码;测试类继承 Specification,用 given/when/then 等块组织逻辑,支持 where 参数化及 Mock/Stub 行为验证。

Spock 是基于 Groovy 的测试框架,专为行为驱动开发(BDD)设计,在 Java 项目中可直接使用,语法简洁、可读性强,特别适合编写清晰的单元测试和行为验证。
在 Java 项目中集成 Spock
需添加 Spock 核心依赖(与 JUnit 5 兼容)及 Groovy 运行时。Maven 示例:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>2.4-M1-groovy-4.0</version>
<scope>test</scope>
</dependency>
同时确保项目支持 Groovy 源码(如用 groovy-eclipse-compiler 或 Gradle 的 groovy 插件),测试类放在 src/test/groovy 目录下(非 java),IDE 需识别 Groovy 文件类型。
立即学习“Java免费学习笔记(深入)”;
编写 Spock 测试类的基本结构
测试类继承 spock.lang.Specification,方法用 def 声明,用 given、when、then 等块组织逻辑,语义贴近自然语言。
- given:准备测试上下文(如创建被测对象、模拟依赖)
- when:执行待测行为(调用方法)
- then:声明预期结果(断言 + 异常检查)
- 可选 and、where(用于参数化)、cleanup(清理资源)
示例(测试一个简单计算器):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class CalculatorSpec extends Specification {
Calculator calc = new Calculator()
def "add returns sum of two numbers"() {
given:
int a = 2, b = 3
when:
int result = calc.add(a, b)
then:
result == 5
}
}
用 where 块实现参数化行为测试
Spock 的 where 块让一组输入-输出的场景描述非常直观,避免重复写多个测试方法。
def "multiply handles positive and negative cases"() {
given:
Calculator calc = new Calculator()
when:
int result = calc.multiply(x, y)
then:
result == expected
where:
x | y | expected
2 | 3 | 6
-2 | 4 | -8
0 | 100 | 0
}
每列对应变量名,竖线分隔,数据行自动循环执行,失败时能精准定位哪组数据出错。
模拟依赖与验证交互行为
用 Mock() 或 Stub() 替换外部协作对象,配合 1 * service.doSomething() 验证调用次数与参数,体现“行为”而非仅“状态”。
-
Mock():严格校验调用是否发生、次数、参数(默认不响应,需用>>定义返回) -
Stub():只关心返回值,忽略调用细节 -
1 * logger.info("user created")表示必须恰好调用一次 -
0 * repository.save(_)可断言某方法未被调用
Spock 的交互式验证天然契合行为测试目标:关注“系统做了什么”,而非仅仅“返回了什么”。

















