尝试保存 Spy 对象 Grails 4.1.2 时出现“这不是已知的持久类型”

问题描述 投票:0回答:1

我无法保存到正在监视其他对象的数据库对象。这使得测试变得更加困难。
这个问题有任何解决方法吗?或者您知道它是否是有意为之?我不确定这是否是一个错误。

我的测试代码

// 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。
Gradle 版本 5.6.4

grails save grails-orm spock spy
1个回答
0
投票

testImplementation 'org.spockframework:spock-core:2.4-M1-groovy-2.5'
升级spock版本解决了问题。
grails 4.1.2 上默认有版本 1.3-groovy-2.5 导致了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.