1
我想用Spock測試一個繼承一個只讀id的對象,但爲了做測試,我需要設置一個值。我已經使用hasProperty驗證了該屬性在運行時存在。我試過的是:動態覆蓋由Mock()返回的對象的屬性spock
def au = Mock(AisUser)
au.id >> 2L
我不能用metaClass做,因爲它是一個模擬。有沒有其他方法可以動態覆蓋該屬性?也許從對象中刪除它,然後重新動態插入?
我想用Spock測試一個繼承一個只讀id的對象,但爲了做測試,我需要設置一個值。我已經使用hasProperty驗證了該屬性在運行時存在。我試過的是:動態覆蓋由Mock()返回的對象的屬性spock
def au = Mock(AisUser)
au.id >> 2L
我不能用metaClass做,因爲它是一個模擬。有沒有其他方法可以動態覆蓋該屬性?也許從對象中刪除它,然後重新動態插入?
經過大量弄亂我的代碼,我想出了它。每次調用靜態方法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')
編輯:DEF AU =假(AisUser); au.id >> 2L; – user2855334
在'AisUser'類中聲明'id'屬性還是動態屬性? –
它是由AisUser繼承的屬性。 – user2855334