2011-01-01 5 views
1

My Grails Unit Testは、Expandoを使ってMailServiceをモックアウトし、sendMailメソッドを再定義します。元のコードでは、接頭辞なしのEMAIL_SUBJECTという静的定数が使用されています。しかし、私がテストを実行してから削除するSomething.EMAIL_SUBJECT "何か" mockMailServiceが渡されたというアサーションに失敗しましたnull "Something"のようにテストを改善するにはどうすればよいですか? EMAIL_SUBJECTでは必要ありませんか?行動だけ一見に奇妙であることを静的定数値がMailServiceに渡されることをテストする方法sendMail closure WIthout定数にクラス接頭辞が必要ですか?

class Something { 

    static def EMAIL_SUBJECT = "value of constant" 

    def mailService = new SomeMailThing() 

    def doSomethingThatCallsMailService() { 
      mailService.sendMail { 
      subject Something.EMAIL_SUBJECT // Remove Something prefix 
     } 
    } 

} 

答えて

2

テストコードのスニペット:

def createMockMailService() { 

    def mockMailService = new Expando() 

    mockMailService.sendMail = { callable -> 

     callable.delegate = mockMailService 
     callable.resolveStrategy = Closure.DELEGATE_FIRST 
     callable.call() 
    } 

    mockMailService.subject = { header -> } 

    mockMailService 
} 

void testThis() { 
    def mockMailService = createMockMailService() 

    mockMailService.subject = { assert it == "value of constant" } 

    Something something = new Something() 
    something.mailService = mockMailService 

    something.doSomethingThatCallsMailService() 
} 

商法でテスト。根本的な原因は、DELEGATE_FIRST解決戦略と、この場合はExpandoインスタンスであるデリゲートを組み合わせたものです。 DELEGATE_FIRSTは、最初にデリゲートのEMAIL_SUBJECTプロパティを探します。これはmockMailServiceです。これはExpandoです。 Expandoは不足しているプロパティにgroovy.lang.MissingPropertyExceptionを投げず、代わりにnullを返します。したがって、プロパティはデリゲートで見つかり、所有者(これはプロパティを取得するSomething)で評価されません。

解決方法をOWNER_FIRSTに変更できます。 mailServiceがこの戦略でsendMailクロージャーパラメータを呼び出すため、DELEGATE_FIRSTを使用したい場合は、あなたの模擬メールサービスにExpandoを使用することはできません。代わりに、通常のオブジェクトを使用してメタクラスでメタプログラミングを行うことができます。

それはこのようなものになります。

def createMockMailService() { 
    def mockMailService = new Object() 
    mockMailService.metaClass.sendMail = { callable -> 
     callable.delegate = mockMailService 
     callable.resolveStrategy = Closure.DELEGATE_FIRST 
     callable.call() 
    } 
    mockMailService.metaClass.subject = { header -> } 
    mockMailService 
} 
+0

ニースの仕事プロパティは、Expandoでオブジェクト(ヌル)の「い」されていた理由を説明します。通常のオブジェクトを使用し、metaClassでメタプログラミングを行うのは素晴らしい考えです!それも動作します!ありがとう! – finneycanhelp

関連する問題