2016-09-06 58 views
2

我想寫JUnit測試的錯誤處理方法爲我的應用程序,它看起來像這樣你如何模擬可拋物體?

public void myHandlingError(Throwable t) {//content} 

我想小樣Throwable對象,但我找不到任何例子。 這是我在想什麼...

public void myHandlingErrorTest(){ 
     Throwable t = new Exception(); 
     myClass.myHandlingError(t); 
     . 
     . 
     . 

任何建議,將不勝感激!

回答

7

術語模擬不知何故意味着你使用一個模擬框架,如EasyMock來創建你正在尋找的對象。但對於代表例外的對象來說,這是很少需要的你看,異常通常是在「錯誤輸入」上創建的。

我的測試通常會做什麼:將某些「不良」輸入驅動到類中;然後期望拋出某個異常。我的測試會捕獲該異常,並檢索該異常的一個或多個屬性;例如它的消息(使用assert進行驗證)。

而另一方面:例外情況是您在生產代碼(大部分時間)內使用創建的東西。因此,無論如何都沒有簡單的方法來嘲笑。並創建一個工廠的異常,並使用依賴注入......聽起來像是過度殺傷。你看,關於異常的好處是:在大多數情況下,代碼是關於:「拋出錯誤的輸入」。所以你只需提供錯誤的輸入,除了在你的測試中拋出異常以進一步驗證。

就你而言,你正在測試實際上接收throwable/exceptions對象作爲參數的代碼;在這裏,使用開始的方法就可以了 - 在測試中創建對象並將其傳遞給「處理程序」。

1

要回顯GhostCat's excellent answer,你不應該使用模擬異常或throwables。這是有幾個原因:

  • 例外是一類數據對象的:而不是充當合作者,例外攜帶一塊協作者之間的數據。數據對象通常很難模擬,有很多get方法存在(對於可變數據對象更是如此,其中set需要被匹配的副作用模擬)。因爲數據對象通常沒有依賴關係和穩定的實現,所以在測試中使用真實的類很少有缺點。
  • Throwable有一些難以模擬的系統提供的方法,如fillInStackTrace。你不應該在模擬這樣的事情。
  • Throwable還有一些不可能模擬的方法,如addSuppressedgetSuppressed。因爲它們是最終的,所以EasyMock和Mockito不能使用動態代理來覆蓋它們,所以甚至要模擬這些方法,你必須使用PowerMock或其他一些字節碼重寫模擬工具。
  • 有各種現有的,易於實例化,經過良好測試的系統例外,您可以創建並傳入,包括IllegalArgumentException,NullPointerException,甚至RuntimeException本身。
  • Throwable,Exception和RuntimeException是非常明確地爲子類設計的,所以如果你想用自定義的子類進行測試,你可以很容易地在你的測試中創建一個真正的嵌套的Exception或Throwable子類。

離開嘲笑非數據對象,其中互動事項您的SUT或MUT的總承包合同,並使用實物或輸入您的拋出異常和異常。