Grails – Spock不使用Groovy MetaClass更改为服务测试

Grails – Spock不使用Groovy MetaClass更改为服务测试,第1张

概述在Spock单元测试中,我试图测试独立于get GithubUrlForPath的方法findRepositoriesByUsername的行为,两者都属于同一个服务. 重复尝试使用metaClass失败: > String.metaClass.blarg产生错误没有这样的属性:blarg for class:java.lang.String > service.metaClass.getGith 在Spock单元测试中,我试图测试独立于get GithubUrlForPath的方法findRepositorIEsByUsername的行为,两者都属于同一个服务.

重复尝试使用MetaClass失败:

> String.MetaClass.blarg产生错误没有这样的属性:blarg for class:java.lang.String
> service.MetaClass.getGithubUrlForPath修改服务实例不起作用
> GithubService.MetaClass.getGithubUrlForPath修改服务类不起作用
>尝试在测试方法的设置中的MetaClass上添加/修改方法,以及何时块,都没有按预期工作

考试:

package grails.wootimport grails.test.mixin.TestFor@TestFor(GithubService)class GithubServiceSpec extends spock.lang.Specification {    def 'MetaClass test'() {        when:        String.MetaClass.blarg = { ->             'brainf***'        }        then:        'some string'.blarg == 'brainf***'    }    def 'can find repositorIEs for the given username'() {        given:        def username = 'username'        def requestPathParts        when: 'the service is called to retrIEve JsON'        service.MetaClass.getGithubUrlForPath = { pathParts ->            requestPathParts = pathParts        }        service.findRepositorIEsByUsername(username)        then: 'the correct path parts are used'        requestPathParts == ['users',username,'repos']    }}

服务:

package grails.wootimport grails.converters.JsONclass GithubService {    def APIHost = 'https://API.github.com/'    def findRepositorIEsByUsername(username) {        try{            JsON.parse(getGithubUrlForPath('users','repos').text)        } catch (fileNotFoundException ex) {            // user not found        }    }    def getGithubUrlForPath(String ... pathParts) {        "${APIHost}${pathParts.join('/')}".toURL()    }}

我已经测试了groovy shell中的String.MetaClass.blarg示例(由grails启动),它按预期方式执行.

我在这里有一个根本的误解吗?我究竟做错了什么?有没有更好的方法来处理所需的测试(替换测试服务上的方法)?

解决方法 这就是如何编写测试以使它们通过:

def 'MetaClass test'() {    given:        String.MetaClass.blarg = { -> 'brainf***' }    expect:        // note blarg is a method on String MetaClass         // not a fIEld,invoke the method        'some string'.blarg() == 'brainf***'}def 'can find repositorIEs for the given username'() {    given:        def username = 'username'        def requestPathParts    when: 'the service is called to retrIEve JsON'        service.MetaClass.getGithubUrlForPath = { String... pathParts ->            requestPathParts = pathParts            [text: 'blah'] // mimicing URL class        }        service.findRepositorIEsByUsername(username)    then: 'the correct path parts are used'        requestPathParts == ['users','repos']}
总结

以上是内存溢出为你收集整理的Grails – Spock不使用Groovy MetaClass更改为服务测试全部内容,希望文章能够帮你解决Grails – Spock不使用Groovy MetaClass更改为服务测试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1220422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存