8

我仍然是 EMF 的新手,所以也许我的问题没有真正意义,或者我假设错误。

我正在做一个模型驱动的项目,所以我定义了一个 ecore 元模型并生成了关联代码。现在我正在尝试进行单元测试,我需要能够测试对象之间的相等性,尤其是扩展 EObject 的对象之间的相等性。

我尝试使用 EcoreUtil.equals() 进行测试,但它总是返回 false,因为我的对象包含列表(类 EList)中的引用,这些引用的排序方式不同。但是,我在我的元模型中明确定义了引用没有排序:我想使用它们更像是 Set 而不是 List。

所以,我最终决定在我生成的 *Impl 类中实现我自己的 equals 方法,即使它在 javadoc 中不鼓励,但它还有另一种更优雅的方式来测试 EMF 对象之间的结构相等性,而不考虑顺序清单?

谢谢!

4

3 回答 3

2

您可以实现自己的实用程序类,使用 EObject 默认的 equals 方法编写自己的无序列表比较代码。

您可以 使用列表“包含”而不是像该方法那样按索引在EqualityHelper.equals(List list1, List list2)中实现您的实现。

于 2013-04-16T20:32:47.160 回答
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)]]
}
于 2014-01-27T12:18:21.757 回答
0

这可以通过使用EMap, 来解决,前一个列表的元素作为键,任意其他类型,例如EString,作为值。

如果一个元素应该在集合中,则将其映射到空字符串。

EMap<SomeClass, EString> someSet;

如果列表可以包含多个元素,请将其映射到给出元素数量的整数。

于 2016-09-10T16:44:20.257 回答