单元测试 - Grails String.encodeAsBase64() 在 Spock 测试中失败



当我在Grails中运行时,这段代码工作正常。

String getLoginToken() {
    generatePassword()
    passwordExpired = false
    [email, password].join(',').encodeAsBase64()
}

但是,此斯波克测试失败

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在String类上提供了encodeAsBase64()(参见:http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.html),那么为什么这在单元测试中不起作用呢?

而不是

"Blah".encodeAsBase64()

你需要

"Blah".encodeBase64()

没有"As"

您还可以为正在使用的方法包含一个模拟编解码器。

and: "add the Base64 codec"
    mockCodec(org.codehaus.groovy.grails.plugins.codecs.Base64Codec)

这有效,但我像一个糟糕的黑客一样倒下了。 当然,必须有更干净的解决方案:

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"
}

最新更新