2013-10-08 38 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')