动态覆盖由Mock()spock返回的对象的属性

时间:2013-10-08 10:33:55

标签: grails groovy spock

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

然后在那个区块我可以这样做:

1 * au.getProperty('id')