2012-03-26 61 views
1

我花了一些時間尋找解決問題的方法,但沒有成功! 這裏是我的問題:我有一些代碼,執行以下操作:如何測試吞下的異常

public void DoSomething(){ 
    try{ 
     DoStuffThatCanThrowException(); 
    }catch(Exception e){ 
     // Do nothing... 
    } 
} 

正如你所看到的,try catch塊燕子能在DoStuffThatCanThrowException()拋出的所有異常。 我正在努力想辦法編寫一個單元測試,基本確保在DoStuffThatCanThrowException()中沒有任何異常。這裏的難點在於我既不能更改try catch塊,也不能更改DoStuffThatCanThrowException()方法。

任何提示的高度讚賞。

編輯 一個重要的細節我忘了提,我不能直接調用DoStuffThatCanThrowException,因爲它是internal等都不是從外界可見。

+4

看起來像一個大代碼的氣味。任何*好*理由你不能改變方法?似乎有點愚蠢的邏輯有一個嘗試/抓住周圍的東西,你試圖*證明*不能打一個例外。 – KingCronus 2012-03-26 20:40:25

+0

你可以控制任何有關情況(權限,文件的存在,配置,任何東西),以確保引發異常嗎? – 2012-03-26 20:41:13

+1

好像你沒有進行單元測試,因爲你正在測試一個代碼單元,並且取決於另一個代碼單元的結果來驗證你的測試。我想測試DoStuffThatCanThrowException()分開,然後嘲笑調用使用依賴注入的方法 – 2012-03-26 20:46:38

回答

2

對不起,我的答案一塌糊塗,也許反思會幫助你在挖?

ClassContainingInternalMethod cl = new ClassContainingInternalMethod(); 

//any private or internal method you want here. 
MethodInfo dynMethod = 
cl.GetType().GetMethod("DoSomeStuff", BindingFlags.NonPublic | BindingFlags.Instance); 

dynMethod.Invoke(cl, new object[] {}); 
+1

他說:「這裏的困難是我既不能更改try catch塊,也不能改變DoStuffThatCanThrowException()方法。」 – 2012-03-26 20:41:35

+0

@cookieMonster這是不可能的,我不能改變這一點的代碼:( – GETah 2012-03-26 20:43:53

+0

+1。在測試中通過反射調用方法可能會出路... – 2012-03-26 21:44:28

3

你就不能叫DoStuffThatCanThrowException從單元測試本身,因此沒有被嘗試包圍......趕上呢?

編輯:剛剛看到你的方法是內部的。我建議你爲測試的目的制定一個公開的方法來包裝它。這樣你可以暫時測試一些東西。一旦你確定這個方法不會失敗,你就不需要進一步的嘗試......趕上了。

+0

感謝您的回答,這很不幸是不可能的。請看我的編輯 – GETah 2012-03-26 20:42:28

+0

我明白了!沒辦法模擬它? – KingCronus 2012-03-26 20:43:39

0

在try塊中調用DoStuffThatCanThrowException()後立即添加一個肯定的斷言。如果發生異常,則斷言不會被執行。或者,在catch區塊內添加否定斷言。不知道這是否回答你的問題;這不是很清楚。

1

你可以打電話直接DoStuffThatCanThrowException()?如果沒有,則創建包含該try catch塊的原始類的子類,並在沒有catch塊的情況下調用它。

class ClassUnderTest extends OriginalClass 
{ 
    @Override 
    public void functionToTest() 
    { 
      DoStuffThatCanThrowException() 
    } 

} 

另外,測試是否存在異常是很困難的。你需要找到所有可能引發的異常,然後進行測試。即使那樣,你所說的只是「給這些測試,沒有例外拋出」。這並不比說「絕對不會拋出異常」更強大,但它通常足夠好。