大部分Mokc架構是不支援mock靜态方法的,那我們如何測試靜态方法呢?
下面這個類包含了一個靜态方法:
這個類調用了上面的Helper類中的靜态方法
如果我們需要測試MyManager類,那麼我們就需要mock MyHelper.GetHelp() 方法,因為MyHelper類我們無法從外面傳入,也無法時候用mock架構來mock。這個類得Manage()方法變得無法測試。
解決方案:
1,如果所有代碼你都可以修改,那麼,最簡單的方法就是避免靜态方法,将靜态方法轉移到一個實體類中,并且使用interface隔離接口和實作邏輯。
2,如果靜态方法你無法修改,比如說是系統提供的幫助類,那麼将靜态方法轉移到一個實體類中,但是使用一個代理函數調用靜态方法,并且使用interface隔離接口和實作邏輯。
3,如果靜态方法你無法修改,還有一個比較快的方法就是,增加一個protected virtual 的成員方法,代理調用靜态方法。測試時,override 這個方法。
有一些時候,你測試某個類中的一個方法,這方法會調用這個類中的其他成員方法,處于某種原因,對于這些依賴的成員方法,你也許想mock出來。
參考:
<a href="http://tiredblogger.wordpress.com/2008/05/06/moq-mocks-use-virtual-method-or-interfaces/">MoQ Mocks – Use virtual method or interfaces?</a>
<a href="http://lnbogen.com/2007/07/04/HowToMockStaticClassOrStaticMemberForTesting.aspx">How to mock static class or static member for testing</a>