2014-05-23 25 views
1

我有一個正常的類中的方法具有與多個catches一個tryJava JUnit - 是否可以確定是否拋出了哪個異常?

Object returnObject = null; 
try { 
    // do some stuff to set returnObject 
} 
catch (NoSuchMethodException ex) { 
    ex.printStackTrace(); 
} 
catch (InstantiationException ex) { 
    ex.printStackTrace(); 
} 
catch (IllegalAccessException ex) { 
    ex.printStackTrace(); 
} 
catch (IllegalArgumentException ex) { 
    ex.printStackTrace(); 
} 
catch (InvocationTargetException ex) { 
    ex.printStackTrace(); 
} 
return returnObject; 

在我UnitTest我想測試方法是否成功地通過了東西就在try,沒有進入caught Exceptions之一。

我知道,如果我沒有在我的正常類的方法有try-catch,我可以只使用一個try-catchAssert.fail(...);,或ExpectedException-tag在測試方法的前面。

但是,我的方法確實有一個try-catch,我想要UnitTest如果我成功通過try,而不去catches之一。 (正如你在上面的代碼中看到的,我所有的catches只有一個ex.printStackTrace();

PS:我也不能使用try中的東西來測試。所以我不能檢查returnObject是否爲null之後的方法,因爲在這種情況下,我希望它是null(但不會去catch)。否則我不會問這個問題。

在此先感謝您的回覆。

+1

如果你只是'.printStackTrace()',不是一個機會;無論如何,這是非常糟糕的做法。難道你不能把它拋出去,或者拋出另一個異常作爲原因? – fge

+0

@fge我知道這是不好的做法。我沒有想過我會遇到這樣的情況,但我在這裏。我也許可以'拋出新的AssertionException();',但是當我剛剛運行普通項目時進入這個'catch'時會發生什麼。我還考慮添加一個if(unitTestBoolean)throw new AssertionException ();',其中'unitTestBoolean'將在默認的'false'在我的正常項目中,並且我可以在我的'UnitTest'中將它(暫時)設置爲'true'。我只是希望有一種更簡單的方法來查看'我的'UnitTests'中'Exception'是否被'抓住',雖然.. –

+0

@Joe:這並不完全像我對這個問題的重複。看來,OP想要避免調用異常情況。 – Makoto

回答

0

我認爲你的單元測試並不需要知道異常在方法中是否被拋出和捕獲。你的單元測試應該測試你方法的合同。而且它不應該擔心這個合同是如何實施的。因此,如果方法的契約在發生錯誤並且沒有問題時返回null,則以這種方式進行測試。如果在方法執行和異常類型中調用者應該知道異常,那麼你可以用hasException()方法返回一些包裝對象。

0

您可以在全局字符串變量(使用全局 - 因爲您已經返回一個對象)中分配異常名稱,並比較assert語句中的字符串。如果沒有異常情況,返回的字符串將是空白的。

public static String message=""; // global variable 

Object returnObject = null; 
try { 
    // do some stuff to set returnObject 
} 
catch (NoSuchMethodException ex) { 
    message=ex.getMessage(); 
    ex.printStackTrace(); 
} 
catch (InstantiationException ex) { 
    message=ex.getMessage(); 
    ex.printStackTrace(); 
} 
catch (IllegalAccessException ex) { 
    message=ex.getMessage(); 
    ex.printStackTrace(); 
} 
catch (IllegalArgumentException ex) { 
    message=ex.getMessage(); 
    ex.printStackTrace(); 
} 
catch (InvocationTargetException ex) { 
    message=ex.getMessage(); 
    ex.printStackTrace(); 
} 
return returnObject; 

,並斷言 -

assertEquals(ClassName.message.equalsIgnoreCase(""),true); 
+0

我認爲添加全局變量或方法哪個任務不屬於全班目的,只需要進行單元測試並不是一個好主意。 – Moses

+0

我同意你的看法。但是需求是這樣的。由於該方法已經返回一個對象,我們必須接受另一個變量的幫助。由於方法內部的變量不能在外部訪問,所以我提出了一個全局變量。同樣爲了在課堂以外訪問它,我將它公開並且是靜態的。 –

0

您可以訪問的JVM出來放流。我們已經與遺憾的是沒有采用記錄遺留代碼做到了這一點,但它打印的所有信息的System.out

出於演示,看看這個類拋出一個給定的異常或沒有,如果null在構造函數中傳遞。拋出的異常將被處理並打印到System.out,就像你在你的問題中解釋的一樣。

public class SystemOutClass { 

    private Exception exception; 

    public SystemOutClass(Exception exception) { 
     super(); 
     this.exception = exception; 
    } 

    public Object doStuff() { 
     Object returnObject = null; 
     try { 
      doThrowException(); 
     } catch (NoSuchMethodException ex) { 
      ex.printStackTrace(); 
     } catch (InstantiationException ex) { 
      ex.printStackTrace(); 
     } catch (IllegalAccessException ex) { 
      ex.printStackTrace(); 
     } catch (IllegalArgumentException ex) { 
      ex.printStackTrace(); 
     } catch (InvocationTargetException ex) { 
      ex.printStackTrace(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return returnObject; 
    } 

    private void doThrowException() throws NoSuchMethodException, 
    InstantiationException, IllegalAccessException, InvocationTargetException, 
    Exception { 
     if (exception != null) { 
      throw exception; 
     } 
    } 
} 

的根據測試將切換的System.out到已知ByteArrayOutputStream,然後又可以對某些內容進行檢查。

public class SystemOutTest { 

    private PrintStream defaultOutStream; 

    private ByteArrayOutputStream outStream; 

    @Before 
    public void setupStandardOutStream() { 
     outStream = new ByteArrayOutputStream(); 
     defaultOutStream = System.out; 
     System.setOut(new PrintStream(outStream)); 
    } 

    @After 
    public void cleanUpOutStream() { 
     System.setOut(defaultOutStream); 
    } 

    private String getConsoleOutput() { 
     return outStream.toString(); 
    } 


    @Test 
    public void handleNoSuchMethodException() { 
     // given 
     SystemOutClass handlingClass = new SystemOutClass(new NoSuchMethodException()); 

     // when 
     handlingClass.doStuff(); 

     // then 
     getConsoleOutput().contains("java.lang.NoSuchMethodException"); 
    } 

} 
0

如果你有,你想在隔離測試方法的特定部分,因此重構類:

Object doSomeStuffAndPossiblyFail() 
{ 
    Object returnObject = null; 
    // do some stuff to set returnObject 
    return returnObject; 
} 

Object doSomeStuffAndReportFailureAsNull() 
{ 
    Object returnObject = null; 
    try { 
     returnObject = doSomeStuffAndPossiblyFail(); 
    } 
    catch (NoSuchMethodException ex) { 
     ex.printStackTrace(); 
    } 
    catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } 
    .... 
    return returnObject; 
} 

您現在可以自由地測試doSomeStuffAndPossiblyFail沒有完成拋任何例外。

相關問題