Validation Grails测试:如果后跟.validate(),则新实例解析为null

Validation Grails测试:如果后跟.validate(),则新实例解析为null,validation,testing,grails,nullpointerexception,constraints,Validation,Testing,Grails,Nullpointerexception,Constraints,我有一个域类Ward。它有一个我想测试的约束name (medi_abs是包裹Ward所在地): 目前,WardTests.groovy如下所示: package medi_abs @TestFor(Ward) @Mock(Ward) class WardTests { void testInstance() { def wardx = new Ward(name: 'OP') assertEquals 'OP', wardx.name }

我有一个域类
Ward
。它有一个我想测试的约束
name
medi_abs
是包裹
Ward
所在地):

目前,WardTests.groovy如下所示:

package medi_abs

@TestFor(Ward)
@Mock(Ward)

class WardTests {
    void testInstance() {
        def wardx = new Ward(name: 'OP')
        assertEquals 'OP', wardx.name
    }
    void testConstraints() {
        mockForConstraintsTests(Ward)
        def wardx = new Ward(name: 'OP')
        assertTrue wardx.validate()
    }
}
当我运行
test-app-Ward
命令时,testInstance不会失败,但testConstraints会失败,然后出现以下错误消息:

groovy.lang.MissingPropertyException: No such property: validate for class: medi_abs.WardTests at medi_abs.WardTests.testConstraints
[编辑:现在我收到的错误消息是这样的,我不知道它为什么会改变:]

java.lang.NullPointerException
at grails.test.MockUtils$_addValidateMethod_closure87.doCall(MockUtils.groovy:1022)
at grails.test.MockUtils$_addValidateMethod_closure88.doCall(MockUtils.groovy:1065) 
at medi_abs.WardTests.testConstraints(WardTests.groovy:43)

似乎在第一个方法中,
Ward
被正确实例化,但与validate()命令相关,
wardx
为空。到目前为止,我找不到任何好的示例,我是否使用了validate()错误?或者是否有更好的方法来测试Grails中的约束?

如果您使用
@TestFor
注释,则无需为域类添加
@Mock
。只有在关联时,或者在为其他人工制品(例如控制器)运行单元测试时,才需要
@Mock

而mock方法的赋值是
void mockForConstraintsTests(Class clazz,List instances=[])
,因此您需要传递将要准备的实例列表

因此,您的代码应该如下所示:

package medi_abs

@TestFor(Ward)
class WardTests {
    void testInstance() {
        def wardx = new Ward(name: 'OP')
        assertEquals 'OP', wardx.name
    }
    void testConstraints() {
        def wardx = new Ward(name: 'OP')
        mockForConstraintsTests(Ward, [wardx])
        assertTrue wardx.validate()
    }
}

如果使用
@TestFor
注释,则无需为域类添加
@Mock
。只有在关联时,或者在为其他人工制品(例如控制器)运行单元测试时,才需要
@Mock

而mock方法的赋值是
void mockForConstraintsTests(Class clazz,List instances=[])
,因此您需要传递将要准备的实例列表

因此,您的代码应该如下所示:

package medi_abs

@TestFor(Ward)
class WardTests {
    void testInstance() {
        def wardx = new Ward(name: 'OP')
        assertEquals 'OP', wardx.name
    }
    void testConstraints() {
        def wardx = new Ward(name: 'OP')
        mockForConstraintsTests(Ward, [wardx])
        assertTrue wardx.validate()
    }
}

你也试过添加吗?我试过添加,它运行了两次测试,然后错误又出现了。将
mockForConstraintsTests(Ward)
移动到
setup()
并查看。再次,有一次它说“所有测试都通过了”,然后错误又回来了。我的full WardsTests.groovy现在看起来像是,三个中间测试方法都抛出了上述异常。number属性有一个唯一性约束。抱歉,在忙于其他事情时误导了您,Sergio有您需要的答案。您也尝试过添加吗?我尝试过添加它,它在两次测试运行中都有效,然后错误再次出现。将
mockForConstraintsTests(Ward)
移动到
setup()
并查看。再次,有一次它说“所有测试都通过了”,然后错误又回来了。我的full WardsTests.groovy现在看起来像是,三个中间测试方法都抛出了上述异常。number属性有唯一性约束。抱歉,在忙于其他事情时误导了您,Sergio有您需要的答案。@dmahapatro不要担心:-)无论出于什么原因,在一两次测试运行后再次返回错误消息。今天上午尝试再次运行测试,首先没有错误,然后在两次测试运行后再次出现错误-现在我回到没有错误的状态。我开始相信这不是真正的grails问题。@dmahapatro不必担心:-)无论出于何种原因,在一两次测试运行后,错误消息再次返回。今天早上,我又尝试运行了一次测试,首先没有错误,然后在两次测试运行后再次出现错误-现在我又恢复到没有错误。我开始相信这不是一个真正的grails问题。