Spock:给 Java 测试加层 Groovy 糖
文章目录Spock给 Java 测试加层 Groovy 糖1、 这玩意儿是干嘛的2、 为什么要用它3、 模块构成4、 安装使用5、 自己构建6、 适合哪些人用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 测试长这样classCalculatorSpecextendsSpecification{def两数相加应返回正确结果(){given:一个计算器calculatornewCalculator()when:执行加法resultcalculator.add(a,b)then:结果符合预期resultexpectedwhere:a|b||expected1|2||35|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、 模块构成Spock 不是一个 jar 包拆成几个模块按需引spock-core核心框架必引spock-spring和 Spring TestContext 框架的集成spock-guiceGuice 2 和 3 的集成spock-tapestryTapestry 5 IoC 容器的集成spock-unitilsUnitils 测试工具集的集成只做核心测试就引 spock-core跑 Spring 就加 spock-spring。4、 安装使用Gradle 配置repositories{mavenCentral()}dependencies{testImplementationorg.spockframework:spock-core:2.4-groovy-4.0testImplementationorg.spockframework:spock-spring:2.4-groovy-4.0}注意 Groovy 版本号要在 artifact 里写明。2.4-groovy-4.0和2.4-groovy-3.0是不同的 jar按项目里 Groovy 版本选。跑测试就用 gradlew test和普通 JUnit 测试没差别。CI 流水线不用改。5、 自己构建要改源码自己构建得装两套 JDKJDK 11 用于 toolchains 编译JDK 17 跑 Gradle 构建本身。JDK 路径不在 Gradle 默认搜索路径里就在环境变量里指定JDK11/path/to/jdk11JDK17/path/to/jdk17。./gradlew build ./gradlew build -Dvariant4.0 ./gradlew build -DjavaVersion17variant 参数选 Groovy 版本变体javaVersion 选测试用的 JDK 版本。Groovy 2.5 不支持 Java 17Groovy 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。