对象未保存在 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
}
我有一个 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
}