2011-09-09 11 views
0

私はWebアプリケーションのためのセレン援助を書いています。そしてその機能の1つとして、私はgrailsサービスの応答を取りやめています。後でサービスを「元に戻す」ようにメソッドを永続化する方法はありますか?私のテスト・アシスト・コードは実動コードから完全に切り離すことができ、実際のサービス・レイヤーにテスト・エイドが漏れないという考えがあります。メソッドを後で保存して一定期間スタブするにはどうすればよいですか?

これはサービスを「オフ」にしても問題ありませんが、これを元に戻すことは問題です。

は、私はこれをやっている:

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

私はちょうどmyService.metaClass.method1を保存するが、後でそれを設定しようと試みたが、単にメソッドスタブを残します。

後でmethod1method2を保存するにはどうすればよいですか?

答えて

2

あなたは、例えば、getMetaMethodでの参照を取得することができます

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

MyService.metaClass.method1 = { -> true } 

def myService = ... 

def realValue = oldMethod.invoke(myService) 
+0

MyService.metaClass.method1 = oldMethod1はmethod1の呼び出しを変更していないようです。すべき? –

+1

私はExpandoMetaClassがどのようにMetaMethodで動作するのかよく知られていませんが、これはうまくいくはずです: 'MyService.metaClass.method1 = { - > oldMethod1.invoke(delegate)}' –

+0

うん、それは間違いなく動作します。 –

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) 
     } 
} 
関連する問題