1. 概述

Spock 是一个面向 Java 和 Groovy 应用的测试与规范框架。Gradle 是流行的构建工具,可作为 Maven 的替代方案。

本教程将展示如何:

  • ✅ 使用 Gradle 创建项目并添加 Spock 依赖
  • ✅ 从基础配置逐步过渡到 Spring 集成
  • ✅ 优化依赖管理方案

2. Spock 与 Gradle 基础配置

2.1. 创建 Gradle 项目

首先安装 Gradle,然后通过 gradle init 初始化项目。Gradle 项目核心配置文件包括:

  • build.gradle:构建脚本,定义 Java 版本、依赖库等
  • settings.gradle:项目级配置,如项目名称、子模块结构

以下是一个 Java 17 项目的最小化构建脚本:

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

test {
    useJUnitPlatform()
    testLogging {
        events "started", "passed", "skipped", "failed"
    }
}

关键配置说明:

  • testImplementation:添加 JUnit 5 测试依赖
  • useJUnitPlatform():启用 JUnit 平台运行测试
  • testLogging:配置测试日志输出

2.2. 添加 Spock 依赖

仅需两步即可集成 Spock:

  1. 添加 Groovy 插件
  2. 引入 Spock 核心依赖

更新后的构建脚本:

plugins {
    id 'java'
    id 'groovy'  // 新增 Groovy 插件
}

repositories {
    mavenCentral()
}

dependencies {
    // Spock 测试依赖
    testImplementation 'org.spockframework:spock-core:2.4-M1-groovy-4.0'
    // JUnit 依赖
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

// 其他配置保持不变...

⚠️ 注意:Spock 依赖版本需与 Groovy 版本匹配(示例中为 Groovy 4.0)

2.3. 运行 Spock 测试

创建测试类时需注意:

  • 必须继承 Specification
  • 测试方法使用 Groovy 的 def 语法
  • 文件应放在 test/groovy 目录,扩展名为 .groovy

示例测试类:

class SpockTest extends Specification {
    def "1+1 应该等于 2"() {
        expect:
        1 + 1 == 2
    }
}

执行测试命令:

gradle test

典型输出:

> Task :test

SpockTest > 1+1 应该等于 2 STARTED
SpockTest > 1+1 应该等于 2 PASSED

BUILD SUCCESSFUL in 15s

3. 集成 Spring 生态

3.1. Spock 与 Spring 基础集成

在 Spring 项目中添加 Spock 需要额外依赖:

dependencies {
    // Spring 核心依赖
    implementation 'org.springframework:spring-web:6.1.0'
    
    // Spring 测试依赖
    testImplementation 'org.springframework:spring-test:6.1.0'
    
    // Spock-Spring 集成依赖
    testImplementation 'org.spockframework:spock-spring:2.4-M1-groovy-4.0'
    
    // 其他依赖保持不变...
}

关键依赖说明:

  • spock-spring:Spock 与 Spring 集成的核心模块
  • spring-test:提供 Spring 测试上下文支持

3.2. Spock 与 Spring Boot 集成

替换 Spring 基础依赖为 Spring Boot Starter:

dependencies {
    // Spring Boot Web 依赖
    implementation 'org.springframework.boot:spring-boot-starter-web:3.0.0'
    
    // Spring Boot 测试依赖
    testImplementation 'org.springframework.boot:spring-boot-starter-test:3.0.0'
    
    // Spock 依赖保持不变...
}

3.3. 依赖管理优化方案

方案一:使用 Spring Boot 插件

plugins {
    id 'java'
    id 'groovy'
    id "org.springframework.boot" version "3.2.1"
    id 'io.spring.dependency-management' version '1.0.14.RELEASE'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    // Spock 依赖保持不变...
}

优势:

  • ✅ 自动管理依赖版本
  • ✅ 简化依赖声明
  • ✅ 统一版本升级入口

方案二:使用 BOM 机制

plugins {
    id 'java'
    id 'groovy'
    id 'io.spring.dependency-management' version '1.1.4'
}

dependencyManagement {
    imports {
        mavenBom 'org.springframework.boot:spring-boot-dependencies:3.2.1'
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation(
        'junit:junit',  // 兼容 JUnit 4
        'org.spockframework:spock-core:2.4-M1-groovy-4.0',
        'org.spockframework:spock-spring:2.4-M1-groovy-4.0',
        'org.springframework.boot:spring-boot-starter-test'
    )
}

优势:

  • ✅ 更灵活的依赖控制
  • ✅ 支持多版本共存
  • ✅ 适合复杂项目结构

4. 总结

通过本教程我们掌握了:

  • ✅ Gradle 项目基础配置
  • ✅ Spock 测试框架集成方案
  • ✅ Spring 生态无缝整合技巧
  • ✅ 两种依赖管理最佳实践

Spock 框架在数据驱动测试和交互测试方面表现优异,配合 Gradle 简洁的构建语法,能显著提升测试开发效率。对于 Spring 项目,推荐使用方案一的插件管理方式,简单粗暴且维护成本低。


原始标题:Setting up and Using Spock With Gradle | Baeldung