【问题标题】:dynamically override property to object returned by Mock() spock动态覆盖 Mock() spock 返回的对象的属性
【发布时间】:2013-10-08 10:33:54
【问题描述】:

我正在尝试使用继承只读 id 的 Spock 测试一个对象,但为了进行测试,我需要设置一个值。我已经用 hasProperty 验证了该属性在运行时存在。我试过的是这样的:

def au = Mock(AisUser)
au.id >> 2L

我不能用 metaClass 来做,因为它是一个模拟。有没有其他方法可以动态覆盖该属性?也许将其从对象中删除,然后动态重新插入?

【问题讨论】:

  • 编辑:def au = Mock(AisUser); au.id >> 2L;
  • id 属性是在AisUser 类中声明的,还是动态属性?
  • 是AisUser继承的属性。

标签: grails groovy spock


【解决方案1】:

经过大量修改代码后,我想通了。每次调用静态方法retrieveCurrentAisUser 时都会返回一个AisUser 的实例。但是我在我的设置块中动态添加了该静态方法。所以我想,因为我声明了一个闭包,并且我可以访问块的其余部分的变量,所以我将创建一个 AisUser 的实例,每次执行闭包时我都会返回它,我会在上面放一个 Spy实例,以便我可以验证它的行为。而且我还通过元编程动态添加了 id。可能是因为我没有在 AisUser 上调用 mockDomain 它不会强制执行 readonly 属性,但我不确定为什么它让我这样做,但它确实有效。所以这是代码:

def au = Spy(AisUser)
SecurityUtil.metaClass.'static'.retrieveCurrentAisUser = { boolean param ->
    au.id >> 1L
    return au;
}

在 then 块中我可以这样做:

1 * au.getProperty('id')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多