Spock:给 Java 测试加层 Groovy 糖

spockframework/spock 在 GitHub 上拿到 3.6K Star 了。

这是个用 Groovy 写的 BDD 测试框架,跑在 Java 和 Groovy 应用上,基于 JUnit Platform。最新版本 2.4 在 2025 年 12 月发布,支持 Groovy 2.5、3.0、4.0、5.0 四个分支。

正文顶部截图

1、 这玩意儿是干嘛的

给 Java 项目写测试用例,写多了就知道 JUnit 那套 setUp tearDown assert 加上注解堆出来的代码有多啰嗦。Spock 用 Groovy 的语法糖把这些事全包了,写成可读的规约(specification)而不是一堆 test 方法。

一段 Spock 测试长这样:

class CalculatorSpec extends Specification {
    def "两数相加应返回正确结果"() {
        given: "一个计算器"
        calculator = new Calculator()

        when: "执行加法"
        result = calculator.add(a, b)

        then: "结果符合预期"
        result == expected

        where:
        a | b || expected
        1 | 2 || 3
        5 | 5 || 10
    }
}

given when then then where 这种结构是它核心特征。where 块直接列参数表跑数据驱动测试,省单独写参数化测试的功夫。

2、 为什么要用它

JUnit 写参数化测试得 @ParameterizedTest 加 @CsvSource 或 @MethodSource,注解套注解。Spock 的 where 块把数据和测试逻辑摆在一起看,表格化呈现。

它还有几个 JUnit 不直接给的特性:

  • Mockito 风格的 Mock 写法内置进来了,不用单独引 Mockito。def mock = Mock(Collaborator) 一行就建好。
  • 异常测试用 then: thrown(Exception) 字面量写法,比 assertThrows 直观。
  • 测试名直接用字符串字面量 “两数相加应返回正确结果”,不用驼峰命名拼句子。

对 Groovy 项目,Spock 基本就是默认测试框架。对 Java 项目,它是替代 JUnit 5 的可选项。

3、 模块构成

README区域截图

Spock 不是一个 jar 包,拆成几个模块按需引:

  • spock-core:核心框架,必引
  • spock-spring:和 Spring TestContext 框架的集成
  • spock-guice:Guice 2 和 3 的集成
  • spock-tapestry:Tapestry 5 IoC 容器的集成
  • spock-unitils:Unitils 测试工具集的集成

只做核心测试就引 spock-core,跑 Spring 就加 spock-spring。

4、 安装使用

Gradle 配置:

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.spockframework:spock-core:2.4-groovy-4.0'
    testImplementation 'org.spockframework:spock-spring:2.4-groovy-4.0'
}

注意 Groovy 版本号要在 artifact 里写明。2.4-groovy-4.02.4-groovy-3.0 是不同的 jar,按项目里 Groovy 版本选。

跑测试就用 gradlew test,和普通 JUnit 测试没差别。CI 流水线不用改。

5、 自己构建

要改源码自己构建,得装两套 JDK:JDK 11 用于 toolchains 编译,JDK 17 跑 Gradle 构建本身。JDK 路径不在 Gradle 默认搜索路径里,就在环境变量里指定 JDK11=/path/to/jdk11 JDK17=/path/to/jdk17

./gradlew build
./gradlew build -Dvariant=4.0
./gradlew build -DjavaVersion=17

variant 参数选 Groovy 版本变体,javaVersion 选测试用的 JDK 版本。Groovy 2.5 不支持 Java 17+,Groovy 5.0 不支持 Java 11 以下,这两条限制要注意。

6、 适合哪些人用

  • 写 Groovy 项目的团队,Spock 是这类项目的标配
  • Java 项目想换种测试写法,让测试代码读起来像规约文档的人
  • 做参数化测试密度高、想用表格化数据驱动方式的开发者
  • 团队对测试可读性有要求、觉得 JUnit 注解套娃写法太啰嗦的工程团队

Java 8 起支持,Groovy 2.5 起。Spring 项目可以直接用 spock-spring 接上现有 TestContext。

性有要求、觉得 JUnit 注解套娃写法太啰嗦的工程团队

Java 8 起支持,Groovy 2.5 起。Spring 项目可以直接用 spock-spring 接上现有 TestContext。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐