我有一个令牌实体:
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 = {
}
}
以及具有以下方法的服务类:
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 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 。我的问题是为什么没有保存?我有许多其他测试以类似的方式构建,并且它们没有任何问题。
感谢您的任何建议。
答案 0 :(得分:2)
您有两个未设置的字段(标识符和过期日期)。默认情况下,每个字段都不可为空。尝试添加:
assert token.save(...)
检查您的对象是否真的被保存。
如果您希望它们接受null作为值,则需要在约束中指定它
static constraints = {
identifier nullable: true
expiration nullable: true
}
答案 1 :(得分:0)
尝试将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
}