如何用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
相关产品推荐
相关产品推荐

