2

我有这个对象

@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' 文档工作:“设置集合或数字属性的最小大小。”

4

2 回答 2

7

该文档可能具有误导性。minSize 约束仅适用于:

  1. 细绳
  2. 数组
  3. 实现 java.util.Collection 接口的类

java.util.Map但是不扩展java.util.Collection接口

supports方法MinSizeConstraint

public boolean supports(Class type) {
        return type != null && (
                String.class.isAssignableFrom(type) ||
                Collection.class.isAssignableFrom(type) ||
                type.isArray());
    }

您可以为此开发自己的自定义约束,也可以按照 Thermech 的建议开发自定义验证器

此外,为了让 Grails 正确模拟 validate 方法,您的测试类应该类似于:

@TestMixin(ControllerUnitTestMixin) class FooTest {
    @Test
    void shouldNotValidateIfItemsIsEmpty() {
        Foo foo = mockCommandObject Foo

        foo.items = [:]

        assert !foo.validate()
    } }
于 2013-03-18T20:47:53.790 回答
1

我发现的唯一方法是使用自定义验证器:

static constraints = {
    items validator:  { Map map, obj, errors ->
        if (map.size() < 1) errors.rejectValue('items', 'minSize.notmet')
    }
}
于 2013-03-18T19:11:11.210 回答