Grails – Spock不使用Groovy MetaClass更改为服务测试
发布时间:2020-12-14 16:22:16 所属栏目:大数据 来源:网络整理
导读:在Spock单元测试中,我试图测试独立于get GithubUrlForPath的方法findRepositoriesByUsername的行为,两者都属于同一个服务. 重复尝试使用metaClass失败: String.metaClass.blarg产生错误没有这样的属性:blarg for class:java.lang.String service.metaClas
|
在Spock单元测试中,我试图测试独立于get
GithubUrlForPath的方法findRepositoriesByUsername的行为,两者都属于同一个服务.
重复尝试使用metaClass失败: > String.metaClass.blarg产生错误没有这样的属性:blarg for class:java.lang.String 考试: package grails.woot
import 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.woot
import grails.converters.JSON
class 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']
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- perl学习笔记七----文件
- django 2.1错误: Specifying a namespace in include() wi
- 【Allwinner ClassA20类库分析】 1.ARM上的Delphi - Lazaru
- django ajax报错解决:You called this URL via POST, but
- golang获取上月的开始日期和结束日期
- Delphi XE5 Android Dialogs 对话框
- lua
- 在Perl中使用带有while循环的continue块是否有优势?
- laravel环境配置的常见问题
- Perl lib version (v5.8.3) doesn't match executable
