unit-testing - 使用服务和插件依赖项测试自定义 Grails Taglib

标签 unit-testing testing grails plugins integration-testing

我有一个需要调用服务方法的自定义标签库,该服务方法又使用 Wslite plugin 发送和接收 SOAP 消息。标签库看起来像这样。

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 对象始终为 null。

鉴于此,我决定最好将此作为集成测试进行;这将使我能够访问插件和服务,没问题。

但是,只有当您的测试类扩展了 GroovyPagesTestCase 时,applyTemplate 方法才有效。但是,如果您那样做,渲染方法将不起作用,至少在集成测试中不起作用。我知道 applyTemplate 和 render do 在标签库的单元测试中彼此协同工作,因为我已经以这种方式测试了其他标签库。

我似乎进退两难。要访问他们调用的服务、插件和 SOAP 服务,我需要进行集成测试。要使用 applyTemplate() 方法,我需要扩展 GroovyPagesTestCase,但这会破坏渲染方法。我已经尝试将 import grails.test.GroovyPagesTestCase 添加到我的测试类,然后从中调用 applyTemplate 方法,但这会导致缺少方法异常。

想法?

Grails 版本是 2.0.1,但如果有帮助,我可以升级到 2.2.1(我们的网站正在转换)。

---附录----- elias 建议我可以注入(inject)一个 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)

最佳答案

几天前我也在为类似的事情苦苦挣扎,这是我解决它的方法:

  1. 保持集成测试中的测试(不需要扩展任何东西)
  2. 使用 grailsApplication.mainContext.getBean 获取 taglib bean 的实例
  3. 使用方法调用对其进行测试

就是这样! :)

class MyTagLibTests {
    def grailsApplication
    def taglib

    @Before
    void setUp(){
        // grab the taglib instance from Spring context
        taglib = grailsApplication.mainContext.getBean(MyTagLib.class.name)
    }

    @Test
    void myTestAboutThisTag() {
        def thisTagArgs = [:] // set up the arguments here
        assert 'shouldResultThis' == taglib.thisTag(thisTagArgs).toString()
    }
}

关于unit-testing - 使用服务和插件依赖项测试自定义 Grails Taglib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17113733/

相关文章:

PHPUnit 不会自动检测目录中的文件

python - 单元测试中的设置部分似乎被忽略

java - PowerMock:java.lang.IllegalAccessError:模拟 java.util.ServiceLoader 时的 java.lang.Class

testing - 如何编写此 BDD 脚本?

django - 集成测试DRF

json - 如何将漂亮的 JSON 放入 REST api 中

java - GAE (Java) 高复制数据存储测试 - 测试用例之间未清除数据存储

python - 告诉 f2py 跳过一个函数

javascript - 如何在jquery中克隆后删除输入字段

jquery-ui - 在jquery标签中显示Grails域