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

如何避免重复定义仅含固定字段的无方法类?适配Rest Assured需求

替代大量重复类的最优方案

你当前的方案确实不是最优解,会带来类爆炸问题——100+个结构完全一致的类不仅冗余,后续修改字段(比如新增/调整字段)时需要修改所有类,维护成本极高。下面是几种更高效的替代思路,完全适配Rest Assured的使用场景:

1. 使用枚举类(最推荐,适合固定不变的静态数据)

枚举天然适合这种每个实例属性固定、数量有限的场景,既保证了单例性,又能通过枚举名.属性的方式便捷访问,还能统一维护所有实例:

import org.json.JSONObject;

public enum Person {
    ADAM("Adam", 1),
    BRIAN("Brian", 2),
    // 依次添加剩余98+个实例
    ;

    // 定义所有12个固定字段
    private final String name;
    private final int code;
    // 其他10个字段...

    Person(String name, int code) {
        this.name = name;
        this.code = code;
        // 初始化其他字段
    }

    // Getter方法(可通过Lombok的@Getter自动生成)
    public String getName() { return name; }
    public int getCode() { return code; }
    // 其他字段的Getter...

    // 转换为符合要求的JSON对象
    public JSONObject toJson() {
        JSONObject json = new JSONObject();
        json.put("name", name);
        json.put("code", String.valueOf(code)); // 将code转为字符串
        // 其他字段按规则放入JSON
        return json;
    }
}

使用方式:

  • 访问字段:Person.ADAM.getName()
  • 在Rest Assured中使用:
    given()
        .body(Person.ADAM.toJson().toString())
        .when()
        .post("/your-endpoint");
    
    或者直接利用Rest Assured的序列化支持,传入枚举对象(需确保序列化配置正确,将枚举属性映射为JSON字段)。

2. 通用数据类+静态常量容器

先定义一个包含所有12个字段的通用数据类,再用一个容器类存储所有实例的静态常量,避免创建大量重复类:

// 通用数据类,包含所有固定字段
public class PersonData {
    private String name;
    private int code;
    // 其他10个字段...

    // 构造器(可通过Lombok的@AllArgsConstructor自动生成)
    public PersonData(String name, int code) {
        this.name = name;
        this.code = code;
        // 初始化其他字段
    }

    // Getter方法(可通过Lombok的@Getter自动生成)
    public String getName() { return name; }
    public int getCode() { return code; }
    // 其他字段的Getter...
}

// 静态常量容器,存储所有实例
public class PersonConstants {
    public static final PersonData ADAM = new PersonData("Adam", 1);
    public static final PersonData BRIAN = new PersonData("Brian", 2);
    // 依次添加剩余98+个实例
}

使用方式:

  • 访问字段:PersonConstants.ADAM.getCode()
  • 在Rest Assured中直接传入实例,框架会自动序列化符合要求的JSON:
    given()
        .contentType(ContentType.JSON)
        .body(PersonConstants.ADAM)
        .when()
        .post("/your-endpoint");
    

3. 配置文件加载(适合数据可能变动的场景)

如果后续数据可能需要调整,可将所有实例数据存储在YAML/JSON/Properties配置文件中,通过工具类加载到内存,实现数据与代码解耦:

示例YAML配置文件(persons.yml):

persons:
  ADAM:
    name: "Adam"
    code: 1
    # 其他10个字段...
  BRIAN:
    name: "Brian"
    code: 2
    # 其他10个字段...

加载工具类:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
import java.util.Map;

public class PersonLoader {
    private static final Map<String, PersonData> PERSON_MAP;

    static {
        try {
            ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
            PersonConfig config = mapper.readValue(new File("persons.yml"), PersonConfig.class);
            PERSON_MAP = config.getPersons();
        } catch (Exception e) {
            throw new RuntimeException("加载人员数据失败", e);
        }
    }

    public static PersonData getPerson(String key) {
        return PERSON_MAP.get(key);
    }

    // 辅助类,用于映射YAML结构
    private static class PersonConfig {
        private Map<String, PersonData> persons;

        public Map<String, PersonData> getPersons() { return persons; }
        public void setPersons(Map<String, PersonData> persons) { this.persons = persons; }
    }
}

使用方式:

  • 访问字段:PersonLoader.getPerson("ADAM").getName()
  • Rest Assured中的使用方式与通用数据类一致,直接传入加载后的PersonData实例即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:14:51