單元測試的藝術 CH3
- 虛設常式(stub)和接縫(seam)
- 依賴注入的幾種方式
虛設常式(stub)是指系統中產生一個可控的替代物件,來取代相依物件,以方便測試。
接縫(seam)是指程式碼中可以抽換不同功能的地方,包含:
- 使用虛設常式類別
- 增加一個建構函式常數
- 增加一個可設定的公開屬性
- 把一個方法改成可供複寫的虛擬方法
- 把一個委派(delegate)拉出來變成一個參數或屬性供類別外部來決定內容
在命名假物件類別時習慣用 fake ,因為不知道會被當作 stub 或是 mock 使用。
依賴注入的幾種方式
- 建構式參數注入
可讀性高,
但是多參數時會失控,需搭配控制反轉(Inversion of Control, IOC)容器框架,且不適用於非必要(optional)的相依物件。
2. 透過屬性 get 或 set 注入
適合非必要的物件相依或是會被相依物件會被建立預設的物件執行個體。
3. 透過工廠模式
工廠模式大概也分兩種:
第一種是在工廠新增一個賦值方法,供測試時可以注入假相依物件,
簡單又不失去可讀性,推薦的方法。
唯一的缺點是需要了解所有呼叫這個工廠的情況。
第二種是建立假工廠,讓他回傳假的相依物件,會讓測試變得難以理解,盡量避免。
4. 擷取與覆寫 (Extract and Override)
透過被測試類別的區域虛擬方法做為工廠模式,測試時就可以利用繼承並覆寫來注入假的相依物件,簡易而強大。
非常適合只需要相依物件的回傳值時的情況,如果是需要驗證測試類別與相依物件的互動時就不太適合。
注意:
使用何種方式是看怎麼做會讓程式碼語意不會改變太多,不需要對程式碼做出太多的改變。如果原本就有接縫可以注入,就使用原本的接縫就好。