Validation Grails spock测试失败,出现“0”;GroovyCastException:无法强制转换对象;

Validation Grails spock测试失败,出现“0”;GroovyCastException:无法强制转换对象;,validation,grails,groovy,Validation,Grails,Groovy,我有一个简单的类,我正在为它编写测试。当我对该类的实例调用validate()时,会发生一些奇怪的事情,该类与我的date属性的自定义验证器有关。如果我的自定义验证器调用一个静态方法,那么一切看起来都很正常。但是,如果我调用一个非静态方法(我需要这样做,因为我需要检查实例的一些其他属性),我会得到以下错误: Condition failed with Exception: testDate.validate(['date']) == valid | | | org.

我有一个简单的类,我正在为它编写测试。当我对该类的实例调用
validate()
时,会发生一些奇怪的事情,该类与我的
date
属性的自定义验证器有关。如果我的自定义验证器调用一个静态方法,那么一切看起来都很正常。但是,如果我调用一个非静态方法(我需要这样做,因为我需要检查实例的一些其他属性),我会得到以下错误:

Condition failed with Exception:

testDate.validate(['date']) == valid
|        |
|        org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'class hegardt.backend.grails.model.person.TestDate' with class 'java.lang.Class' to class 'hegardt.backend.grails.model.person.TestDate'
|           at hegardt.backend.grails.model.person.TestDate._clinit__closure1$_closure2(TestDate.groovy:20)
|           at groovy.lang.Closure.call(Closure.java:405)
|           at org.grails.datastore.gorm.validation.constraints.ValidatorConstraint.processValidate(ValidatorConstraint.java:100)
|           at org.grails.datastore.gorm.validation.constraints.AbstractConstraint.validate(AbstractConstraint.java:88)
|           at grails.gorm.validation.DefaultConstrainedProperty.validate(DefaultConstrainedProperty.groovy:601)
|           at grails.validation.Validateable$Trait$Helper.doValidate(Validateable.groovy:192)
|           at grails.validation.Validateable$Trait$Helper.validate(Validateable.groovy:163)
|           at grails.validation.Validateable$Trait$Helper.validate(Validateable.groovy:129)
|           at hegardt.backend.grails.model.person.TestDateSpec.test(TestDateSpec.groovy:15)
<hegardt.backend.grails.model.person.TestDate@48bb8764 date=null privateVar=false grails_validation_Validateable__beforeValidateHelper=org.grails.datastore.gorm.support.BeforeValidateHelper@1624fd07 grails_validation_Validateable__errors=grails.validation.ValidationErrors: 0 errors>
这是我的测试课

class TestDateSpec extends Specification {

    @Unroll
    void "test"() {
        given:
            TestDate testDate = new TestDate(date: date)
        expect:
            testDate.validate(['date']) == valid  // This call fails for all 4 test cases...
        where:
            date                        | valid
            null                        | true
            LocalDate.now().plusDays(1) | false
            LocalDate.now()             | false
            LocalDate.now()             | true
    }
}
PS 我也尝试过不使用@GrailsCompileStatic,但这只会生成一个不同的与“强制转换”相关的错误:

Condition failed with Exception:

testDate.validate(['date']) == valid
|        |
|        java.lang.IllegalArgumentException: object is not an instance of declaring class
|           at org.grails.datastore.gorm.validation.constraints.builder.ConstrainedPropertyBuilder.doInvokeMethod(ConstrainedPropertyBuilder.java:65)
|           at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64)
|           at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44)
|           at hegardt.backend.grails.model.person.TestDate._clinit__closure1$_closure2(TestDate.groovy:19)
|           at groovy.lang.Closure.call(Closure.java:405)
|           at org.grails.datastore.gorm.validation.constraints.ValidatorConstraint.processValidate(ValidatorConstraint.java:100)
|           at org.grails.datastore.gorm.validation.constraints.AbstractConstraint.validate(AbstractConstraint.java:88)
|           at grails.gorm.validation.DefaultConstrainedProperty.validate(DefaultConstrainedProperty.groovy:601)
|           at grails.validation.Validateable$Trait$Helper.doValidate(Validateable.groovy:192)
|           at grails.validation.Validateable$Trait$Helper.validate(Validateable.groovy:163)
|           at grails.validation.Validateable$Trait$Helper.validate(Validateable.groovy:129)
|           at hegardt.backend.grails.model.person.TestDateSpec.test(TestDateSpec.groovy:15)
<hegardt.backend.grails.model.person.TestDate@1e742012 date=null privateVar=false grails_validation_Validateable__beforeValidateHelper=org.grails.datastore.gorm.support.BeforeValidateHelper@4f3967c7 grails_validation_Validateable__errors=grails.validation.ValidationErrors: 0 errors>
条件失败,出现异常:
testDate.validate(['date'])==valid
|        |
|java.lang.IllegalArgumentException:对象不是声明类的实例
|位于org.grails.datastore.gorm.validation.constraints.builder.ConstrainedPropertyBuilder.doInvokeMethod(ConstrainedPropertyBuilder.java:65)
|位于groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64)
|位于groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44)
|在hegardt.backend.grails.model.person.TestDate.\u clinit\u closure1$\u closure2(TestDate.groovy:19)
|调用(Closure.java:405)
|位于org.grails.datastore.gorm.validation.constraints.ValidatorConstraint.processValidate(ValidatorConstraint.java:100)
|位于org.grails.datastore.gorm.validation.constraints.AbstractConstraint.validate(AbstractConstraint.java:88)
|位于grails.gorm.validation.DefaultConstrainedProperty.validate(DefaultConstrainedProperty.groovy:601)
|位于grails.validation.validatable$Trait$Helper.doValidate(validatable.groovy:192)
|位于grails.validation.validatable$Trait$Helper.validate(validatable.groovy:163)
|位于grails.validation.validatable$Trait$Helper.validate(validatable.groovy:129)
|位于hegardt.backend.grails.model.person.TestDateSpec.test(TestDateSpec.groovy:15)

您试图从不允许的静态上下文(
静态约束块
)调用实例方法(
validateDate
)。您可以将
validateDate
标记为
static
,但这会将问题转移到
privateVar
,它是一个实例变量,因此您无法通过
static
方法达到该目的。不清楚该字段扮演什么角色,因此也不清楚如何最好地处理该问题,但问题中描述的问题是由于您试图从静态上下文调用实例方法而引起的。

validateDate()必须是静态的。现在,您说是,这是有意义的,因为约束块是静态的。这里也这么说:
Condition failed with Exception:

testDate.validate(['date']) == valid
|        |
|        java.lang.IllegalArgumentException: object is not an instance of declaring class
|           at org.grails.datastore.gorm.validation.constraints.builder.ConstrainedPropertyBuilder.doInvokeMethod(ConstrainedPropertyBuilder.java:65)
|           at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64)
|           at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44)
|           at hegardt.backend.grails.model.person.TestDate._clinit__closure1$_closure2(TestDate.groovy:19)
|           at groovy.lang.Closure.call(Closure.java:405)
|           at org.grails.datastore.gorm.validation.constraints.ValidatorConstraint.processValidate(ValidatorConstraint.java:100)
|           at org.grails.datastore.gorm.validation.constraints.AbstractConstraint.validate(AbstractConstraint.java:88)
|           at grails.gorm.validation.DefaultConstrainedProperty.validate(DefaultConstrainedProperty.groovy:601)
|           at grails.validation.Validateable$Trait$Helper.doValidate(Validateable.groovy:192)
|           at grails.validation.Validateable$Trait$Helper.validate(Validateable.groovy:163)
|           at grails.validation.Validateable$Trait$Helper.validate(Validateable.groovy:129)
|           at hegardt.backend.grails.model.person.TestDateSpec.test(TestDateSpec.groovy:15)
<hegardt.backend.grails.model.person.TestDate@1e742012 date=null privateVar=false grails_validation_Validateable__beforeValidateHelper=org.grails.datastore.gorm.support.BeforeValidateHelper@4f3967c7 grails_validation_Validateable__errors=grails.validation.ValidationErrors: 0 errors>