2015-05-04 36 views
0

我是新來的單元測試斯卡拉,我找不到一種方法來存根單一對象中定義的函數。斯卡拉單元測試 - stubbing一個單身人士

例如:

class Profile { 
    def getLatest 
    ... 
    Feed.getLatestEntries 
    ... 
} 

object Feed { 
    def getLatestEntries: Future[List[FeedEntry]] { /* Access some API*/ } 
} 

我試圖單元測試在資料類中定義的getLatest功能。 因爲我不想在單元測試中通過網頁實際訪問外部API,所以我試圖將Feed對象和它的getLatestEntries函數存根以返回一些預定義的值。

我已經研究了ScalaMock,EasyMock和Mockito框架,但是找不到一種方法來存儲單例對象的方法。 ScalaMock的狀態

爲什麼所有的模擬框架都不提供這種功能?我怎樣才能做到這一點?存根Feed.getLatestEntries

由於

回答

3

我的方法是創建單作爲性狀的邏輯,然後讓對象延伸的性狀。這允許我提供Singleton作爲默認或隱式參數,但提供測試的殘缺實現

trait FeedLogic { 
    def getLatestEntries: Future[List[FeedEntry]] { /* Access some API*/ } 
} 

object Feed extends FeedLogic 

def somethingWantingFeed(...)(feed: FeeLogic = Feed) = { ??? } 
+1

不夠公平。但是,將對象函數提取到特徵中僅僅是爲了讓它們存根,對我來說似乎很棘手 - 我不認爲測試技術問題會影響我的代碼設計。是否有任何其他理由將所有對象函數提取爲特徵? – Dani

+1

我想我的反說法是一個隱藏某種不可配置狀態或依賴關係的單例對象,這使得它在功能上無法測試,本身就是一種設計異味。代碼應該是可測試的而不會嘲笑框架的體操,這些功能對於測試場景而言是方便的,而不是它們的啓用者。 –

+0

我明白你的觀點,我接受你的答案,並給予作文+1。我一直在閱讀很多有關蛋糕模式的內容,這種情況是否涉及? – Dani