:
テストコードのスニペット:
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
}
出典
2011-01-02 11:38:48
hlg
ニースの仕事プロパティは、Expandoでオブジェクト(ヌル)の「い」されていた理由を説明します。通常のオブジェクトを使用し、metaClassでメタプログラミングを行うのは素晴らしい考えです!それも動作します!ありがとう! – finneycanhelp