2016-07-07 8 views
2

私は次のようにコントローラがあり、単純なドメインにMissingMethodException:Groovyメタクラスを使用してメソッドを置き換えた後、メソッドエラーのシグネチャがありませんか?

class Cat { 

    String name 

    static constraints = { 
    } 
} 

を持っている:

class CatController { 

    def index() { } 


    def say(){ 


     def cat = new Cat(name: "cc") 
     cat.save() 

     render "done" 

    } 
} 

をし、次のように私がテスト、統合テストを持っている:

class CatTests extends GroovyTestCase{ 

    CatController controller = new CatController() 

    @Test 
    void testSomething() { 


     Cat.metaClass.save = { 

      throw new Exception("Asdasd") 
     } 

     shouldFail(Exception){ 

       controller.say() 

     } 


     GroovySystem.metaClassRegistry.removeMetaClass(Cat.class) 


    } 


    @Test 
    void testSomething2() { 

     def before_cat_count = Cat.count() 

     controller.say() 

     def after_cat_count = Cat.count() 

     assertEquals after_cat_count - before_cat_count, 1 


    } 


} 

私は時に次のエラーを取得しますテストを実行する。それは、このラインtestSomething2()メソッドの

def before_cat_count = Cat.count() 

にカウント方法を見つけていない理由

Failure: testSomething2(cat.CatTests) 
| groovy.lang.MissingMethodException: No signature of method: cat.Cat.count() is applicable for argument types:() values: [] 
Possible solutions: count(), ident(), print(java.lang.Object), print(java.io.PrintWriter), getCount(), wait() 
    at cat.CatTests.testSomething2(CatTests.groovy:37) 
| Completed 2 integration tests, 1 failed in 192ms 

さて、私の疑問や質問があります。

私はすでにtestSomethingメソッドの終わりにメタクラスを削除しました。だから、なぜcount()メソッドが見つからないのだろうかと思います。私は助けていただきありがとうございます!ありがとう!

答えて

0

おそらく、単に

GroovySystem.metaClassRegistry.removeMetaClass(猫)

単に猫、ウェブを発信元

をCat.classない、私はクリーンアップのこのタイプのメソッドを使用します。多くの成功と

cleanup: 
    revokeMetaClassChanges(FirstService, firstServiceInstance) 
    revokeMetaClassChanges(SecondService, null) 

:のような呼び出しで

def revokeMetaClassChanges(Class type, def instance = null) { 
    GroovySystem.metaClassRegistry.removeMetaClass(type) 
    if(instance) { 
     instance.metaClass = null 
    } 
} 

+0

私はちょうどremoveMetaClassパラメータのCat.classの代わりにCatを使用しましたが、うまくいきませんでした。 – kofhearts

+0

Groovyでは、静的な.class参照の代わりにクラス名を使用できます。つまり、CatとCat.classは同等です。 – Corrodias

関連する問題