如何保存一个方法以便稍后将其存根一段时间?

时间:2011-09-09 18:12:42

标签: grails groovy metaprogramming metaclass

我正在为一个Web应用程序编写一个selenium-aid,而对于其中一个函数,我正在删除grails服务的响应。有没有办法在以后保留这些方法,以便我可以“重新启动”服务?我的想法是,我的测试辅助代码可以与生产代码完全分离,并且没有测试辅助工具泄漏到真实服务层。

这可以很好地将服务“关闭”,但重新开启是一个问题。

我这样做:

myService.metaClass.method1 = {true}
myService.metaClass.method2 = {false}

我尝试只存储myService.metaClass.method1,但是稍后尝试设置它只会留下方法存根。

如何存储method1method2以供日后使用?

2 个答案:

答案 0 :(得分:2)

您可以使用getMetaMethod获取引用,例如

def oldMethod1 = MyService.metaClass.getMetaMethod('method1')

MyService.metaClass.method1 = { -> true }

def myService = ...

def realValue = oldMethod.invoke(myService)

答案 1 :(得分:0)

这可能不是最佳方式,但它是 方式。

if (originalServiceMethods.isEmpty()) {
    originalServiceMethods = myService.metaClass.getMethods()
}

myService.metaClass.invokeMethod = {name, args ->
        def newMethods = [:]
        newMethods["method1"] = {true}
        newMethods["method2"] = {false}
        if (name in newMethods.keySet()) {
            return newMethods[name].call()
        }
        else {
            return myService.metaClass.getMetaMethod(name, args)
        }
}

...

if( !originalServiceMethods.isEmpty() ){
        myService.metaClass.invokeMethod = {name, args ->
            MetaMethod method = originalServiceMethods.find { it.name == name }
            method.invoke(myService, args)
        }
}