MissingMethodException:使用groovy元类替换方法后没有方法错误的签名?

时间:2016-07-07 06:27:50

标签: grails 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


    }


}

运行测试时出现以下错误。

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

现在,我的疑问和疑问是为什么它没有在这一行找到计数方法

def before_cat_count = Cat.count() 

of testSomething2()方法。

我已经在方法testSomething的末尾删除了元类。所以,我想知道为什么没有找到count()方法。我感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

也许只是

GroovySystem.metaClassRegistry.removeMetaClass(CAT)

只是Cat,而不是Cat.class

来自网络,我使用一种方法进行此类清理。

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

使用以下调用:

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

取得了很大的成功。