8

私はまだEMFの初心者なので、私の質問が本当に意味をなさないか、間違ったことを想定している可能性があります。

私はモデル駆動型プロジェクトに取り組んでいるので、ecoreメタモデルを定義し、関連コードを生成しました。現在、単体テストを実行しようとしています。オブジェクト間、特にEObjectを拡張するオブジェクト間の同等性をテストできる必要があります。

EcoreUtil.equals()を使用してテストを実行しようとしましたが、オブジェクトに同じ順序ではないリスト(クラスEList)の参照が含まれているため、常にfalseが返されます。ただし、メタモデルで参照が順序付けられていないことを明示的に定義しました。リストよりもセットのように使用したいと思います。

そこで、javadocで推奨されていなくても、生成された* Implクラスに独自のequalsメソッドを実装することにしましたが、EMFオブジェクト間の構造的同等性を、次の順序を考慮せずにテストする別の方法があります。リスト?

ありがとう!

4

3 に答える 3

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 に答える