天天看點

單元測試不可測試那些類(無抽象、靜态類、靜态方法)

實際上“單元測試不可測試那些類(無抽象、靜态類、靜态方法)”是個僞命題,因為事實是:無抽象、靜态類、靜态方法都是不可單元測試的。那麼,如果我們要寫出可測試的代碼,又要用到這些靜态類等,該怎麼辦,實際上我們需要兩個步驟:

1:為它們寫一個包裝類,讓這個包裝類是抽象的(繼承自接口,或者抽象類,或者方法本身是Virtual的);

2:通知用戶端程式員,使用包裝類來代替原先的靜态類來寫業務邏輯;

<a></a>

很明顯,如果我們在某個WebForm的背景方法中,直接使用它的話:

該背景代碼邏輯就無法進行單元測試了,因為類似MOQ的架構所依賴的是代碼本身具有可被重寫行,如果某個類本身是靜态的,就無法在運作時用模拟類替換掉實際類。

是以,寫一個包裝類吧,我們看到微軟為Response寫了一個包裝類,為HttpResponseWrapper:

View Code

光從代碼本身的角度來說,可以說這個類什麼事情也沒做,但是它為我們提供了一個抽象體系(從抽象類HttpResponseBase繼承),這樣的話,我們的用戶端代碼就可以改寫為:

OK,可測試了,因為我們可以在某個地方注入依賴給_response了。

注意,包裝類的撰寫,還可以使用接口,或者幹脆也僅僅隻是一個類,隻要讓被包裝的這個同名的方法是virtual的就可以了。

另外,不可測試的那些類,可能往往已經作為穩定版本送出給客戶了,我們就不能修改源代碼然後告訴客戶說你替換下我們的DLL吧,是以,為了讓用戶端程式員找到我們的包裝類,可以讓包裝類以及被包裝的類使用同一個命名空間。 

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2012/12/31/2840455.html,如需轉載請自行聯系原作者

繼續閱讀