我有一个简单的域名
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()方法。我感谢任何帮助!谢谢!
答案 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)
取得了很大的成功。