You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Groovy Spock的@Unroll和where合并两个void方法测试用例

使用@Unroll和where块合并测试用例

把两个测试用例合并的核心是提取差异变量(是否抛出异常、预期结果、用例描述)到where块,配合@Unroll让每条数据生成独立的测试用例,同时保持逻辑统一。

合并后的完整测试代码如下:

import spock.lang.Unroll
import spock.lang.Specification

class ValidationServiceSpec extends Specification {

    def validationService = new ValidationService()
    def validationLogic = Mock(ValidationLogic)

    @Unroll
    def "test is valid by case - #caseDescription"() {
        given: "待验证的数据"
        Data data = Mock()
        
        // 根据参数设置mock行为
        if (validationThrowsException) {
            1 * validationLogic.validate(data) >> { throw new Exception() }
        } else {
            1 * validationLogic.validate(data)
        }

        when: "执行校验操作"
        def result = validationService.isValidByCriteria(data)

        then: "服务本身不抛出异常"
        noExceptionThrown()
        and: "返回符合预期的校验结果"
        result == expectedResult

        where:
        caseDescription | validationThrowsException | expectedResult
        "合法数据"       | false                      | true
        "非法数据"       | true                       | false
    }
}

关键部分说明:

  • @Unroll:让where块中的每一行数据都作为独立测试用例运行,测试报告里会分别显示"test is valid by case - 合法数据"和"test is valid by case - 非法数据"的执行结果,方便定位问题。
  • where块:集中管理测试用例的差异参数,清晰展示每个场景的输入和预期输出。
  • Mock行为动态设置:在given块中根据validationThrowsException参数,决定validationLogic.validate方法是否抛出异常,统一了两个测试的流程逻辑。

内容的提问来源于stack exchange,提问作者victorio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:40:04