如何避免重复定义仅含固定字段的无方法类?适配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中使用:
或者直接利用Rest Assured的序列化支持,传入枚举对象(需确保序列化配置正确,将枚举属性映射为JSON字段)。given() .body(Person.ADAM.toJson().toString()) .when() .post("/your-endpoint");
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
相关产品推荐
相关产品推荐

