Grails String.encodeAsBase64() 在 Spock 测试中失败
Grails String.encodeAsBase64() Fails in Spock Tests
当我在 Grails 中 运行 这段代码工作正常。
String getLoginToken() {
generatePassword()
passwordExpired = false
[email, password].join(',').encodeAsBase64()
}
但是,这个 Spock 测试失败了
def "test getLoginToken"() {
setup:
String email = "bacon@eggs.edu"
Person person = new Person(email: email)
when:
String token = person.getLoginToken()
then:
token.decodeBase64() == "$email,$person.password"
}
有以下例外情况
| Failure: test getLoginToken(com.campuscardtools.myphotoid.PersonSpec)
| groovy.lang.MissingMethodException: No signature of method: java.lang.String.encodeAsBase64() is applicable for argument types: () values: []
Possible solutions: decodeBase64()
at com.campuscardtools.myphotoid.Person$$EPFScS6i.getLoginToken(Person.groovy:140)
at com.campuscardtools.myphotoid.PersonSpec.test getLoginToken(PersonSpec.groovy:68)
我的理解是 Groovy 在字符串 class 上提供了 encodeAsBase64() (参见:http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.html),那么为什么这在单元测试中不起作用?
这行得通,但我觉得这是一个糟糕的黑客攻击。当然必须有更清洁的解决方案:
def cleanup () {
String.metaClass = null
}
def "test getLoginToken"() {
setup:
String email = "bacon@eggs.edu"
Person person = new Person(email: email)
String encoded = null
and:
String.metaClass.encodeAsBase64 {
encoded = delegate
return delegate
}
when:
String token = person.getLoginToken()
then:
token == "$email,$person.password"
encoded == "$email,$person.password"
}
而不是
"Blah".encodeAsBase64()
你需要
"Blah".encodeBase64()
没有'As'
您还可以为您正在使用的方法包含一个 mockCodec。
and: "add the Base64 codec"
mockCodec(org.codehaus.groovy.grails.plugins.codecs.Base64Codec)
当我在 Grails 中 运行 这段代码工作正常。
String getLoginToken() {
generatePassword()
passwordExpired = false
[email, password].join(',').encodeAsBase64()
}
但是,这个 Spock 测试失败了
def "test getLoginToken"() {
setup:
String email = "bacon@eggs.edu"
Person person = new Person(email: email)
when:
String token = person.getLoginToken()
then:
token.decodeBase64() == "$email,$person.password"
}
有以下例外情况
| Failure: test getLoginToken(com.campuscardtools.myphotoid.PersonSpec)
| groovy.lang.MissingMethodException: No signature of method: java.lang.String.encodeAsBase64() is applicable for argument types: () values: []
Possible solutions: decodeBase64()
at com.campuscardtools.myphotoid.Person$$EPFScS6i.getLoginToken(Person.groovy:140)
at com.campuscardtools.myphotoid.PersonSpec.test getLoginToken(PersonSpec.groovy:68)
我的理解是 Groovy 在字符串 class 上提供了 encodeAsBase64() (参见:http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.html),那么为什么这在单元测试中不起作用?
这行得通,但我觉得这是一个糟糕的黑客攻击。当然必须有更清洁的解决方案:
def cleanup () {
String.metaClass = null
}
def "test getLoginToken"() {
setup:
String email = "bacon@eggs.edu"
Person person = new Person(email: email)
String encoded = null
and:
String.metaClass.encodeAsBase64 {
encoded = delegate
return delegate
}
when:
String token = person.getLoginToken()
then:
token == "$email,$person.password"
encoded == "$email,$person.password"
}
而不是
"Blah".encodeAsBase64()
你需要
"Blah".encodeBase64()
没有'As'
您还可以为您正在使用的方法包含一个 mockCodec。
and: "add the Base64 codec"
mockCodec(org.codehaus.groovy.grails.plugins.codecs.Base64Codec)