我仍然是EMF的新手,所以也许我的问题没有意义,或者我假设错了。
我正在开发一个模型驱动的项目,因此我定义了一个ecore元模型并生成了相关代码。现在我正在尝试进行单元测试,我需要能够测试对象之间的相等性,尤其是在扩展EObject的对象之间。
我尝试使用EcoreUtil.equals()来进行测试,但它始终返回false,因为我的对象包含列表(类EList)中不按相同方式排序的引用。但是,我在我的元模型中明确定义了引用不是有序的:我想使用它们更像Set than List。
所以,我最终决定在我的genereated * Impl Class中实现我自己的equals方法,即使它在javadoc中不鼓励,但它有另一种方式,更优雅,测试EMF对象之间的结构相等而不考虑列表的顺序?
谢谢!
答案 0 :(得分:2)
您可以使用EObject默认equals方法实现自己的实用程序类,其中您可以使用EObject默认的equals方法对无序列表进行自己的比较。
您可以将您的实施基于 EqualityHelper.equals(List list1, List list2)使用列表“包含”而不是像该方法那样按索引进行。
答案 1 :(得分:0)
我在Xtend中编写了以下实用程序方法:
static def boolean equalsTo(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) {
contains(eObjectSet1, eObjectSet2) && contains(eObjectSet2, eObjectSet1)
}
static def boolean contains(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) {
eObjectSet1.forall[eObject1 | eObjectSet2.exists[eObject2 | EcoreUtil.equals(eObject1, eObject2)]]
}
答案 2 :(得分:0)
这可以通过使用EMap
来解决,其中前一个列表的元素作为键,而任意其他类型(例如EString
)作为值。
如果元素应该在集合中,则将其映射到空字符串。
EMap<SomeClass, EString> someSet;
如果列表可以包含多个元素,请将其映射到包含元素数量的整数。