3 回答

TA貢獻1802條經(jīng)驗 獲得超10個贊
前言
對象有幾種定義,不是真實的。一般術(shù)語是測試雙倍。這個術(shù)語包括:虛擬,假,存根,模擬。
參考
根據(jù)Martin Fowler的文章:
虛擬對象傳遞但從未實際使用過。通常它們僅用于填充參數(shù)列表。
假對象實際上有工作實現(xiàn),但通常需要一些使它們不適合生產(chǎn)的快捷方式(內(nèi)存數(shù)據(jù)庫就是一個很好的例子)。
存根提供了在測試期間進行的調(diào)用的固定答案,通常不會對測試中編程的任何內(nèi)容做出任何響應(yīng)。存根還可以記錄有關(guān)呼叫的信息,例如記住它'發(fā)送'的消息的電子郵件網(wǎng)關(guān)存根,或者可能只記錄它'發(fā)送'的消息。
模擬是我們在這里所討論的:預(yù)編程的對象具有預(yù)期,形成了預(yù)期接收的調(diào)用的規(guī)范。
樣式
Mocks vs Stubs =行為測試與狀態(tài)測試
原理
根據(jù)每次測試只測試一件事的原則,在一次測試中可能有幾個存根,但通常只有一個模擬。
生命周期
使用存根測試生命周期:
設(shè)置 - 準備正在測試的對象及其存根協(xié)作者。
練習(xí) - 測試功能。
驗證狀態(tài) - 使用斷言檢查對象的狀態(tài)。
拆解 - 清理資源。
使用模擬測試生命周期:
設(shè)置數(shù)據(jù) - 準備正在測試的對象。
設(shè)置期望 - 準備主要對象正在使用的模擬期望。
練習(xí) - 測試功能。
驗證期望 - 驗證是否已在mock中調(diào)用了正確的方法。
驗證狀態(tài) - 使用斷言檢查對象的狀態(tài)。
拆解 - 清理資源。
摘要
模擬和存根測試都給出了問題的答案:結(jié)果是什么?
使用模擬測試也對以下方面感興趣:結(jié)果如何實現(xiàn)?

TA貢獻1906條經(jīng)驗 獲得超10個贊
以下是對每個示例的描述,然后是真實世界的示例。
虛擬 - 只是虛假的價值來滿足
API
。示例:如果您正在測試一個類的方法,該類在構(gòu)造函數(shù)中需要許多強制參數(shù)而對測試沒有影響,那么您可以創(chuàng)建虛擬對象以創(chuàng)建類的新實例。
假 - 創(chuàng)建一個可能依賴于某些外部基礎(chǔ)結(jié)構(gòu)的類的測試實現(xiàn)。(這是很好的做法,你的單元測試也不要實際上外部基礎(chǔ)設(shè)施交互。)
示例:創(chuàng)建用于訪問數(shù)據(jù)庫的虛假實現(xiàn),將其替換為
in-memory
集合。存根 - 覆蓋返回硬編碼值的方法,也稱為
state-based
。示例:您的測試類取決于
Calculate()
需要5分鐘才能完成的方法。您可以使用返回硬編碼值的存根替換其實際實現(xiàn),而不是等待5分鐘; 只占一小部分時間。模擬 - 非常相似
Stub
但interaction-based
不是基于狀態(tài)。這意味著您不希望Mock
返回某個值,而是假設(shè)方法調(diào)用的特定順序。示例:您正在測試用戶注冊類。打電話后
Save
,應(yīng)該打電話SendConfirmationEmail
。
Stubs
并且Mocks
實際上是子類型Mock
,包括交換實際實現(xiàn)和測試實現(xiàn),但出于不同的,特定的原因。
添加回答
舉報