我有这个对象
@Validateable
class Foo {
Map<String, String> items
static constraints = {
items minSize: 1
}
}
但是此测试失败:
@Test
void shouldNotValidateIfItemsIsEmpty() {
Foo foo = new Foo(items: [:])
assert !foo.validate()
}
我做错了什么?应该按照grails 'minSize' documentation来工作:“设置集合或number属性的最小大小。”
最佳答案
该文档可能会产生误导。 minSize约束将仅适用于:
java.util.Map但是不扩展java.util.Collection接口(interface)
请参阅
supports
的MinSizeConstraint
方法:public boolean supports(Class type) {
return type != null && (
String.class.isAssignableFrom(type) ||
Collection.class.isAssignableFrom(type) ||
type.isArray());
}
您可以为此开发自己的custom constraint或Thermech建议的自定义验证器
另外,为了让Grails正确模拟validate方法,您的测试类应类似于:
@TestMixin(ControllerUnitTestMixin) class FooTest {
@Test
void shouldNotValidateIfItemsIsEmpty() {
Foo foo = mockCommandObject Foo
foo.items = [:]
assert !foo.validate()
} }
关于validation - Grails:如何在 map 上放置minSize约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15483268/