我測試的類,需要模擬中有一個方法調用:用嘲笑的方法調用
class B{
method A();
String method C();
}
現在,我想測試方法A
,以及方法C
模擬電話,如方法C
從URL讀取輸入。我如何使用Mockito來做到這一點?
我測試的類,需要模擬中有一個方法調用:用嘲笑的方法調用
class B{
method A();
String method C();
}
現在,我想測試方法A
,以及方法C
模擬電話,如方法C
從URL讀取輸入。我如何使用Mockito來做到這一點?
此處有多個選項。
也許最簡單的 - 你可以使用mockito間諜(http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13),這是一個對象,你可以存根一些方法,其他方法保留其現有行爲。
或者,您可以使用模擬,然後存根methodA使用靜態doCallRealMethod方法,與thenCallRealMethod結合使用。
但在我看來最重要的是重構你的類,以便從URL讀取的部分是在一個單獨的類。然後寫一個B類的單元測試,使用模擬單獨的類。然後爲從URL讀取的類編寫集成測試。
如果此方法不明確,請在此發佈評論;我會盡力詳細說明。
居然嘲諷的對象(至少具有的Mockito)你嘲笑整個對象並沒有使用一些不推薦的調用,它都含有這在他們的文檔時:
像往常一樣,你要讀的部分模擬警告:面向對象的編程通過將複雜性劃分爲單獨的,特定的SRPy對象來減少複雜性。部分模擬如何適應這種範式?那麼,它只是不......部分模擬通常意味着複雜性已經轉移到同一個對象上的不同方法。在大多數情況下,這不是您想要設計應用程序的方式。
於是兩個解決方案成爲可能:
1 - 你重新設計你的類,這樣methodC是聚合類實際CLASSB的,在這之後你可以注入,可以在測試完全被嘲笑了新的類ClassB的。作爲一種獎勵,您可以更好地分離任務,因爲外部來源的所有交互應該分別封裝以幫助在外部來源發生變化時進行測試和維護(但我不知道您的方法A和C具體做什麼)
2 - 在你的測試類中,你可以擴展ClassB並覆蓋methodC,這會導致一種手動模擬,並且不需要任何模擬框架,但是mockito部分警告仍然可以在這裏保留。
希望這個幫助
好吧,它似乎不是很好的做法,創建一個完全不同的類只是做一個I/O點?你不這麼認爲? – TimeToCodeTheRoad 2012-07-06 20:54:35
我不同意你的看法。但這就是爲什麼我提出三種不同的解決方案。如果你不喜歡它,那麼選擇其中一個。 – 2012-07-07 02:13:53