gpt4 book ai didi

grails - MissingMethodException:使用Groovy元类替换方法后,方法错误没有签名吗?

转载 作者:行者123 更新时间:2023-12-02 14:10:28 26 4
gpt4 key购买 nike

我有一个简单的域

class Cat {

String name

static constraints = {
}
}

Controller 如下:
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() 

testSomething2()方法。

我已经在方法testSomething的末尾删除了元类。因此,我想知道为什么找不到count()方法。感谢您的帮助!谢谢!

最佳答案

也许只是

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)

取得了很大的成功。

关于grails - MissingMethodException:使用Groovy元类替换方法后,方法错误没有签名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38238765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com