maj*_*maj 0 testing validation grails constraints nullpointerexception
我有这个域类Ward.它有这个约束name,我想测试(medi_abs包Ward是位于):
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中的约束?
如果使用@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)