如何创建用于测试的随机EMF(Eclipse建模框架)对象?
随机生成EMF测试对象及关联的实用方案
我之前做EMF相关性能测试时遇到过完全一样的需求,分享下实操的解决思路:
1. 批量创建基础对象
你已经用反射遍历工厂的create.*Instance()方法生成对象了,建议把所有创建好的EObject统一存在一个列表里,同时可以顺便记录每个对象对应的EClass(后续处理关系会用到),比如用List<EObject>或者Map<EObject, EClass>存储。
2. 无硬编码设置随机关联
核心是利用EMF自带的元数据API,不用指定具体类就能操作对象的引用关系:
- 遍历每个
EObject,通过obj.eClass()拿到它的元类信息 - 从元类中筛选出所有
EReference类型的特性(这就是对象之间的关联/所有权定义) - 对每个可修改的
EReference,随机从对象列表里挑选目标对象,直接用EObject.eSet()或eGet()来设置关联(不用管具体类的setter方法)
给你一段可直接复用的Java代码片段:
List<EObject> allEmfObjects = // 你的基础对象列表 Random random = new Random(); for (EObject currentObj : allEmfObjects) { EClass eClass = currentObj.eClass(); // 获取当前对象所有的引用特性(包括继承来的) List<EReference> allReferences = eClass.getEAllReferences(); for (EReference ref : allReferences) { // 随机决定是否设置这个引用,避免所有关联都被填满(可选) if (!ref.isChangeable() || random.nextFloat() > 0.4) { continue; } // 随机挑选一个目标对象(不需要正确性的话不用过滤类型) EObject targetObj = allEmfObjects.get(random.nextInt(allEmfObjects.size())); // 处理单值/多值引用 if (ref.isMany()) { ((List<Object>) currentObj.eGet(ref)).add(targetObj); } else { currentObj.eSet(ref, targetObj); } } }
3. 可选优化点
- 如果需要模拟部分合理结构(比如容器关系),可以通过
ref.isContainment()判断是否是所有权引用,针对性地设置 - 同样的思路可以随机设置属性值:筛选
EAttribute类型的特性,生成对应类型的随机值(比如字符串、整数)用eSet()赋值 - 可以控制对象数量和关联密度,比如按比例生成不同类型的对象,或者限制每个对象的关联数量,避免内存溢出
内容的提问来源于stack exchange,提问作者wojas
相关产品推荐
相关产品推荐

