Как я могу сохранить метод на потом, заглушив его на период времени? - PullRequest
0 голосов
/ 09 сентября 2011

Я пишу селен-помощник для веб-приложения, а для одной из функций я отбрасываю ответы службы Grails. Есть ли способ сохранить методы на потом, чтобы я мог снова включить службу? Идея состоит в том, что мой код вспомогательного тестирования может быть полностью отделен от производственного кода, и никакие вспомогательные средства не попадут в реальный уровень обслуживания.

Это прекрасно работает для выключения службы, но ее восстановление - проблема.

Я делаю это:

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

Я пытался просто сохранить myService.metaClass.method1, но попытка установить его позже просто оставляет заглушку метода.

Как я могу сохранить method1 и method2 для дальнейшего использования?

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Вы можете получить ссылку с помощью getMetaMethod, например,

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

MyService.metaClass.method1 = { -> true }

def myService = ...

def realValue = oldMethod.invoke(myService)
0 голосов
/ 09 сентября 2011

Возможно, это не лучший способ, но это способ.

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)
        }
}
...