0

我有这个域类Wardname我想测试这个约束(medi_absWard位于):

package medi_abs

class Ward {

    String name
    static constraints = {
        name blank:false
    }
}

目前,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 中的约束?

4

1 回答 1

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()
    }
}
于 2013-09-18T20:57:51.527 回答