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

maj*_*maj 0 testing validation grails constraints nullpointerexception

我有这个域类Ward.它有这个约束name,我想测试(medi_absWard是位于):

package medi_abs

class Ward {

    String name
    static constraints = {
        name blank:false
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,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()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行该test-app Ward命令时,testInstance不会失败,但testConstraints将会失败,然后是以下错误消息:

groovy.lang.MissingPropertyException: No such property: validate for class: medi_abs.WardTests at medi_abs.WardTests.testConstraints
Run Code Online (Sandbox Code Playgroud)

[编辑:现在我得到的错误信息就是这个,不知道为什么会改变:]

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)
Run Code Online (Sandbox Code Playgroud)

似乎在第一种方法中,Ward正确实例化,但与validate()命令相关联,wardx则为null.到目前为止我找不到任何好的例子,我使用validate()错了吗?或者甚至有更好的方法来测试Grails中的约束?

Sér*_*els 5

如果使用@TestFor注释,则无需@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()
    }
}
Run Code Online (Sandbox Code Playgroud)