我有这个对象

@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.Collection接口(interface)
  • 的类

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

    请参阅supportsMinSizeConstraint方法:
    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/

    10-10 05:50