2013-10-08 35 views
1

我想用Spock测试一个继承一个只读id的对象,但为了做测试,我需要设置一个值。我已经使用hasProperty验证了该属性在运行时存在。我试过的是:动态覆盖由Mock()返回的对象的属性spock

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

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

+0

编辑:DEF AU =假(AisUser); au.id >> 2L; – user2855334

+0

在'AisUser'类中声明'id'属性还是动态属性? –

+0

它是由AisUser继承的属性。 – user2855334

回答

2

经过大量弄乱我的代码,我想出了它。每次调用静态方法retrieveCurrentAisUser时,都会返回AisUser的实例。但我在我的设置块中动态地添加了这个静态方法。所以我认为,因为我宣布了一个闭包,并且我可以访问其余块的变量,我只需要创建一个AisUser的实例,每次执行闭包时我都会返回它,并且我会把一个间谍放在那个实例,以便我可以验证它的行为。而且我也用metaprogramming动态地添加了id。可能是因为我没有在AisUser上调用mockDomain,它并没有强制执行只读属性,但我不确定它为什么让我这样做,但它有效。因此,这是代码:

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

,并在随后块i可以做到这一点:

1 * au.getProperty('id')