サービス メソッドを呼び出す必要があるカスタム taglib があります。サービス メソッドは、Wslite プラグインを使用してSOAP メッセージを送受信します。taglib はこんな感じです。
class myTagLib {
def myService
def thisTag = {
def parametersFromService = myService.method("argument")
out << render(template:'/myFolder/myView',
model:parametersFromService)
}
}
このタグライブラリのテストを構築しようとしています。私のテストは次のようなものです:
void testThisTag() {
def appliedTagLib = applyTemplate('<thisTag attr="value" />')
def parametersFromService = myService.method("argument")
def renderedTemplate = render(template:'/myFolder/myView',
model:parametersFromService)
assertEquals appliedTagLib, renderedTemplate
}
これを単体テストとして書くことから始めました。私は単純なMockFor(MyService)
注釈を試し、より精巧な方法でそれらをモックしましたmyService
が、taglib がそれを呼び出そうとしたとき、オブジェクトは常に null でした。
そのため、これを単純に統合テストとして行うのが最善であると判断しました。これでプラグインとサービスにアクセスできるようになりますが、問題ありません。
ただし、applyTemplate メソッドは、テスト クラスが GroovyPagesTestCase を拡張する場合にのみ機能します。ただし、それを行うと、render メソッドは機能しません。少なくとも統合テストでは機能しません。この方法で他のtaglibをテストしたので、applyTemplateとrenderがtaglibの単体テストで互いに連携して動作することを知っています。
私は岩と固い場所の間にいるようです。サービス、プラグイン、およびそれらが呼び出す SOAP サービスにアクセスするには、統合テストが必要です。applyTemplate() メソッドを使用するには、GroovyPagesTestCase を拡張する必要がありますが、それによって render メソッドが機能しなくなります。テスト クラスに追加import grails.test.GroovyPagesTestCase
してから、そのクラスから applyTemplate メソッドを呼び出してみましたが、メソッドの例外が見つかりません。
考え?
Grails のバージョンは 2.0.1 ですが、問題がなければ 2.2.1 にアップグレードできます (私たちのサイトは移行中です)。
---補遺----- elias は、grails.gsp.PageRenderer のインスタンスを挿入して、機能するレンダリング メソッドを取得できると提案しました。私はそれを構築しようとしました:
import org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine
import grails.gsp.PageRenderer
...
def pageRenderer
...
void setUp() {
context = grailsApplication.mainContext
taglib = context.getBean(myTagLib.class.name)
pageRenderer = new PageRenderer(new GroovyPagesTemplateEngine(context.getServletContext()))
}
しかし、このエラーを受け取ります:
java.lang.NullPointerException: Cannot invoke method findTemplateByPath() on null object
at grails.gsp.PageRenderer.renderViewToWriter(PageRenderer.groovy:120)
at grails.gsp.PageRenderer.render(PageRenderer.groovy:77)
at MyTagLibIntegrationTests.testThisTag(MyTagLibIntegrationTests.groovy:37)