我无法保存到正在监视其他对象的数据库对象。这使得测试变得更加困难。
这个问题有任何解决方法吗?或者您知道它是否是有意为之?我不确定这是否是一个错误。
我的测试代码
// grails-app/domain/Person.groovy
class Person{
String name = ""
String surname = ""
static mapping = {
id generator: 'identity'
}
}
// src/test/groovy/PersonSpec.groovy
import grails.testing.gorm.DataTest
import spock.lang.Specification
class PersonSpec extends Specification implements DataTest {
def setupSpec() {
mockDomain Person
}
def "persist person"(){
setup:
Person person = new Person()
when:
person.save()
then:
true
}
def "persist spy"(){
setup:
Person person = Spy()
when:
person.save()
then:
true
}
}
// build.gradle
buildscript {
repositories {
maven { url "https://repo.grails.org/grails/core" }
}
dependencies {
classpath "org.grails:grails-gradle-plugin:$grailsVersion"
}
}
repositories {
maven { url "https://repo.grails.org/grails/core" }
}
version "0.1"
group "testapp"
apply plugin:"org.grails.grails-web"
dependencies {
compile "org.grails.plugins:hibernate5"
testCompile "org.grails:grails-gorm-testing-support"
}
# gradle.properties
grailsVersion=4.1.2
第一次测试通过,第二次未通过。
错误信息:
Object [Person : (unsaved)] cannot be persisted. It is not a known persistent type.
org.grails.datastore.mapping.engine.NonPersistentTypeException: Object [Person : (unsaved)] cannot be persisted. It is not a known persistent type.
at org.grails.datastore.mapping.core.AbstractSession.persist(AbstractSession.java:591)
at org.grails.datastore.gorm.GormInstanceApi.doSave(GormInstanceApi.groovy:365)
at org.grails.datastore.gorm.GormInstanceApi.save_closure5(GormInstanceApi.groovy:180)
at groovy.lang.Closure.call(Closure.java:405)
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:319)
at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:40)
at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:179)
at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:119)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:107)
at org.spockframework.mock.runtime.ByteBuddyMethodInvoker.respond(ByteBuddyMethodInvoker.java:20)
at org.spockframework.mock.runtime.MockInvocation.callRealMethod(MockInvocation.java:59)
at org.spockframework.mock.CallRealMethodResponse.respond(CallRealMethodResponse.java:30)
at org.spockframework.mock.runtime.MockController.handle(MockController.java:50)
at org.spockframework.mock.runtime.JavaMockInterceptor.intercept(JavaMockInterceptor.java:72)
at org.spockframework.mock.runtime.ByteBuddyInterceptorAdapter.interceptNonAbstract(ByteBuddyInterceptorAdapter.java:35)
at PersonSpec.persist spy(PersonSpec.groovy:23)
在没有mock的情况下,spy对象不是应该使用原始对象方法吗?那么上面应该可以工作。这是简化版;在我当前的项目中,我为每个测试生成包含一些数据的 Person 对象,然后使用它来创建具有
personObject = Spy(personObject)
的 Spy。用
testImplementation 'org.spockframework:spock-core:2.4-M1-groovy-2.5'
升级spock版本解决了问题。