Metaclass不是实例

时间:2014-12-05 09:05:30

标签: mongodb unit-testing grails metaclass

我有这个代码存根来添加动态属性。我使用mongodb,我想动态添加属性。这是我在单元测试时尝试做的。

User.metaClass.dynamicAttributes = [:]

User.metaClass.propertyMissing = { String name ->
    delegate.dynamicAttributes[name]
}

User.metaClass.propertyMissing = { String name, value ->
    delegate.dynamicAttributes[name] = value
}

但这失败了,我正在超越我的耐心限制!

User u = new User()
u.ppt = 0

User u2 = new User()
u2.ppt = 1

assert u2.ppt == 1
assert u.ppt == 0 // fails here, println shows that u.ppt is also 1! 

2 个答案:

答案 0 :(得分:1)

这里的问题是你的概念完全有缺陷。您正在为此类而不是具有此行的实例分配映射:

User.metaClass.dynamicAttributes = [:]

为了完成您的目标,您需要执行以下操作:

User.metaClass.propertyMissing = { String name ->
  if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
  delegate.dynamicAttributes[name] 
}  
User.metaClass.propertyMissing = { String name, value ->     
  if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
  delegate.dynamicAttributes[name] = value 
}

我确信有更简洁的方法可以做到这一点,但上面演示了一个解决方案,其中地图是按实例实例化而不是跨所有实例。

答案 1 :(得分:0)

更改此

User.metaClass.dynamicAttributes = [:]

User.metaClass.propertyMissing = { String name ->
    delegate.dynamicAttributes[name]
}

User.metaClass.propertyMissing = { String name, value ->
    delegate.dynamicAttributes[name] = value
}

到这个

User.metaClass.propertyMissing = { String name ->
    if (!delegate.metaClass.hasProperty('dynamicAttributes') delegate.metaClass.dynamicAttributes = [:]
    delegate.dynamicAttributes[name]
}

User.metaClass.propertyMissing = { String name, value ->
    if (!delegate.metaClass.hasProperty('dynamicAttributes') delegate.metaClass.dynamicAttributes = [:]
    delegate.dynamicAttributes[name] = value
}

解决了!我不确定,但似乎groovy共享通过metaClass放置的属性!