2011-02-11 55 views
3

測試例外,我已經含有try-catch塊,我不知道如何讓我的測試循環中的方法......無法使用JUnit

這裏是我的代碼:

public class ClassToTest { 
    public void loadFileContent() { 
     try { 
      InputStream fileStream = fileLoader.loadFileContent(); 
      fileContentReader = new BufferedReader(new InputStreamReader(fileStream)); 
     } catch(CustomException ce) { 
      logger.log(Level.SEVERE, "Error message") 
     } 
    } 
} 

public class TestClassToTest { 
    @Test 
    (expected = CustomException.class) 
    public void testCustomException() throws Exception { 
     loadFileContent(); 
    } 
} 

當引發異常時,我想要做的唯一事情就是記錄它,並且所有工作都很好,但是,如何創建一個測試來顯示它的工作原理?

我試圖捕捉控制檯輸出和

assertTrue(consoleOutput.contains("logMessgae") 

和我只跑了特定測試用例擔任長,但是當我在我的測試套件運行它沒有奏效。

回答

2

該方法的契約是捕獲CustomException並將「錯誤消息」記錄到外部組件:記錄器。因此,您應該創建一個模擬記錄器,將其提供給ClassToTest實例,測試該方法並驗證模擬記錄器是否已用aright參數調用。

我個人使用EasyMock(及其「classextension」擴展名)來模擬具體類,但還有其他模擬框架。有關EasyMock和一般嘲笑的信息,請閱讀http://easymock.org/EasyMock3_0_Documentation.html

+0

我從EasyMock開始,但最近更強烈地喜歡Mockito,它基於EasyMock,但擴展到具有更大的覆蓋範圍和更容易使用。退房http://mockito.org – 2011-02-11 19:07:51

0

你的代碼是不可測試的,沒有一個模擬文件。通過嘲笑外部依賴和使用依賴注入(即通過guice),可以使此代碼更易於測試。

0

如果您想要測試在某些情況下拋出CustomException,那麼您應該測試引發異常的代碼,而不是捕獲它的代碼。在你的例子中,我猜你的未定義的「fileLoader」是你期望拋出異常的東西?

如果您試圖測試異常被捕獲並且事情繼續順利運行,那麼您需要重新設計ClassToTest,以便可以注入潛在異常拋​​出類的模擬實現。這個模擬實現總會拋出異常。然後,您可以在您的測試中運行ClassToTest,並聲明任何條件表明它正確處理了異常。

0

我認爲要做到這一點是通過你的記錄到你的類以正確的方式,如果你使用像一個的Mockito模擬框架,你可以用verify驗證記錄:

ClassToTest myInstance = new ClassToTest(myLogger); 

// then, in your unit test 
verify(myLogger).log("my log message") 

這裏的關鍵正在傳遞您的依賴關係,以便您可以驗證與它們的交互。