如何在Spock中为Enum编写单元测试并断言其属性?
验证Enum属性的Spock测试实现
定义的EmployeeType枚举类
public enum EmployeeType { PERMANENT("10"), TEMPORARY("20"), PART_TIME("30"); private final String employeeTypeId; EmployeeType(final String employeeTypeId) { this.employeeTypeId = employeeTypeId; } public String getEmployeeTypeId() { return employeeTypeId; } }
原始测试代码问题
你尝试用Spock遍历所有枚举值,但expect块仅列出属性未做断言,无法验证属性值是否符合预期:
class EmployeeTypeSpec extends Specification { @Unroll def "validate emp type"(EmployeeType employeeType) { expect: // want to assert each employeeType name() and employeeTypeId here employeeType.name() employeeType.employeeTypeId where: employeeType << EmployeeType.values() } }
解决方案
方案一:明确枚举对应预期值(推荐)
通过在where块中一一枚举每个Enum的预期值,结合@Unroll生成独立清晰的测试用例:
class EmployeeTypeSpec extends Specification { @Unroll("验证枚举#employeeType:name为#expectedName,employeeTypeId为#expectedId") def "validate employee type properties"() { expect: employeeType.name() == expectedName employeeType.getEmployeeTypeId() == expectedId where: employeeType | expectedName | expectedId EmployeeType.PERMANENT | "PERMANENT" | "10" EmployeeType.TEMPORARY | "TEMPORARY" | "20" EmployeeType.PART_TIME | "PART_TIME" | "30" } }
这种方式每个测试用例的意图明确,若某个枚举属性不符合预期,能直接从测试名称定位问题。
方案二:通过映射批量验证
适合枚举值较多的场景,先定义Enum与预期ID的映射关系,再遍历验证:
class EmployeeTypeSpec extends Specification { // 定义枚举与预期ID的映射 private final Map<EmployeeType, String> enumIdMapping = [ (EmployeeType.PERMANENT): "10", (EmployeeType.TEMPORARY): "20", (EmployeeType.PART_TIME): "30" ] @Unroll("验证枚举#employeeType的属性正确性") def "validate employee type properties"(EmployeeType employeeType) { expect: // 断言name()为枚举常量的名称 employeeType.name() == employeeType.name() // 断言employeeTypeId匹配映射中的预期值 employeeType.getEmployeeTypeId() == enumIdMapping[employeeType] where: employeeType << EmployeeType.values() } }
核心要点
Spock的expect块需要通过==完成断言逻辑,仅列出属性不会触发验证。结合@Unroll可以让每个枚举值的测试结果独立展示,便于排查问题。
内容的提问来源于stack exchange,提问作者Remo
相关产品推荐
相关产品推荐

