我正在为一个Web应用程序编写一个selenium-aid,而对于其中一个函数,我正在删除grails服务的响应。有没有办法在以后保留这些方法,以便我可以“重新启动”服务?我的想法是,我的测试辅助代码可以与生产代码完全分离,并且没有测试辅助工具泄漏到真实服务层。
这可以很好地将服务“关闭”,但重新开启是一个问题。
我这样做:
myService.metaClass.method1 = {true}
myService.metaClass.method2 = {false}
我尝试只存储myService.metaClass.method1
,但是稍后尝试设置它只会留下方法存根。
如何存储method1
和method2
以供日后使用?
答案 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)
}
}