【发布时间】:2013-06-11 09:54:06
【问题描述】:
我有一个需要调用服务方法的自定义标记库,该方法又使用Wslite plugin 发送和接收 SOAP 消息。 taglib 看起来像这样。
class myTagLib {
def myService
def thisTag = {
def parametersFromService = myService.method("argument")
out << render(template:'/myFolder/myView',
model:parametersFromService)
}
}
我正在尝试为这个 taglib 构建一个测试。我的测试是这样的:
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) 注释,以及mocking them in a more elaborate fashion,但是当taglib 尝试调用它时myService 对象始终为空。
鉴于此,我决定最好将其作为集成测试进行;这将使我可以访问插件和服务,没问题。
但是,applyTemplate 方法仅在您的测试类扩展 GroovyPagesTestCase 时才有效。但是,如果您这样做 that,则 render 方法不起作用,至少在集成测试中不起作用。我知道 applyTemplate 和 render do 在 taglib 的单元测试中相互配合,因为我已经以这种方式测试了其他 taglib。
我似乎在一块石头和一个坚硬的地方之间。为了访问他们调用的服务、插件和 SOAP 服务,我需要一个集成测试。要使用 applyTemplate() 方法,我需要扩展 GroovyPagesTestCase,但这会破坏渲染方法。我尝试将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)
【问题讨论】:
-
您不需要在setUp中初始化它,只需为实例使用正确的bean名称
def groovyPageRenderer就可以了。
标签: unit-testing testing grails plugins integration-testing