1

この特定のトピックについてはたくさんあることは知っていますが、私の問題に出くわした人を見つけることができず、誰かがこれを説明してくれることを願っています.

注入された grailsApplication の動的メソッド 'isDomainClass' を equals メソッドで使用するドメインがあります。

@Override
public boolean equals(Object obj) {
    if(!grailsApplication.isDomainClass(obj.getClass())) { return false }
    ...
}

これは正常に機能し、これを単体テストするには、次のようにします。

@Mock([MyDomain])
...
def mockGApp
void setUp() {
    mockGApp = new Object()
    mockGApp.metaClass.isDomainClass = { obj -> true }
}
...
void testSomething() {
    def myDomain = new MyDomain()
    myDomain.grailsApplication = mockGApp
    ....
}

これを test-app -unit (コマンドラインまたは STS で) で実行すると、うまくいきます。

次に、そのドメインを使用する統合テストを作成し (今回はモックなし)、 test-app -integration (コマンド ラインまたは STS で) を使用して実行すると、再び正常に実行されます。

ただし、「test-app」を実行すると、両方が同時に実行され、MissingMethodException: no method signature isDomainClass exists with parameters (java.lang.Class) ...すべてのジャズが得られます。

テストでテストしているサービスで を使用して調査するとprintln、テストの統合部分で、ドメイン クラスの equals メソッドが呼び出される前に、非常に喜んで呼び出しgrailsApplication.isDomainClass()て目的の効果を得ることができます。ただし、コードがドメインの equals 関数にステップインすると、オブジェクトがサービスで参照され、動的に追加されたメソッドを持つ同じオブジェクトを参照しているisDomainClass()にもかかわらず、メソッドは存在しなくなります。grailsApplication

grails がこのクラスに追加する動的メソッドは、ドメインのメソッド内で呼び出されたときに注入されていませんが、サービス内で注入されているようです。さらに奇妙なことに、これは、統合テストが単体テストに従っている場合にのみ発生します。別々にやれば問題ない...

この汚染はどこから来るのでしょうか? それを解決する方法はありますか?

Grails 2.1.0を使用したPS

4

1 に答える 1

0

destroy メソッドで変更したクラスを metaClassRegistry から削除する必要があります (つまり、テスト ケースの実行後)。下記参照:

@After
void destroy() {
    GroovySystem.metaClassRegistry.removeMetaClass(MyDomain.class)
}
于 2013-03-15T22:11:43.933 に答える