对象未保存在 spock 集成测试中

Object is not saved in spock integration test

我有一个 Token 实体:

class Token {
    /**
     * Constants for various namespaces
     */
    public static final String NS_PASSWORD_RESET = "pass-reset";

    /**
     * A simple string unlimited in content that defines a scope of the token
     */
    String namespace

    /**
     * This fields holds an identifier for anything specific that the process might need 
     */
    Long identifier

    /**
     * The actual token itself
     */
    String token

    Timestamp dateCreated
    Timestamp lastUpdated
    Timestamp expiration

    static mapping = {
        autoTimestamp true
    }

    static constraints = {
    }
}

和一个服务class,方法如下:

def creareNewToken(String ns, int timeout) {
        def token = new Token()

        token.setNamespace(ns)
        token.setToken(this.generateToken(15))

        //persist the object
        token.save(flush: true)

        return token
    }

我为服务创建了一个集成测试 class:

class TokenServiceIntegrationSpec extends IntegrationSpec {

    TokenService tokenService

    def "test creareNewToken"() {
        when:
        def token = tokenService.creareNewToken(Token.NS_PASSWORD_RESET, 60)

        then:
        token instanceof Token
        token.getNamespace() == Token.NS_PASSWORD_RESET
        token.getToken().length() == 15
        token.getDateCreated() == ''
    }
}

当我执行测试时,我得到:

Failure:  test
creareNewToken(com.iibs.security.TokenServiceIntegrationSpec)
    |  Condition not satisfied:
    token.getDateCreated() == ''
    |     |                |
    |     null             false
    com.iibs.security.Token : (unsaved)
        at com.iibs.security.TokenServiceIntegrationSpec.test creareNewToken(TokenServiceIntegrationSpec.groovy:31)

这个问题可能是什么原因造成的?似乎对象实际上没有保存,而且,粗略地说,dateCreated 也没有填充。我的问题是为什么它没有保存?我还有许多以类似方式构建的其他测试,它们可以正常工作。

感谢您的任何建议。

您有两个字段(标识符和过期时间)没有设置。默认情况下,每个字段都不可为空。尝试添加:

assert token.save(...)

检查您的对象是否真的被保存。

如果您希望他们接受 null 作为值,您需要在约束中指定它

static constraints = { 
identifier nullable: true
expiration nullable: true 
} 

尝试将 failOnError:true 添加到保存选项中,如果仅用于调试目的。生成的堆栈跟踪通常会指出是否未设置字段等。

def creareNewToken(String ns, int timeout) {
    def token = new Token()

    token.setNamespace(ns)
    token.setToken(this.generateToken(15))

    //persist the object
    token.save(flush: true, failOnError:true)//this will throw an error if save does not occur

    return token
}