2012-07-11 62 views
4

我該如何編寫一個JUnit測試,檢查FileInputStream是否已關閉?如何測試FileInputStream已關閉?

考慮下面的代碼,

import java.io.FileInputStream; 

class FileInputStreamDemo { 

    public static void main(String args[]) throws Exception { 
    FileInputStream fis = new FileInputStream(args[0]); 

    // Read and display data 
    int i; 
    while ((i = fis.read()) != -1) { 
     System.out.println(i); 
    } 

    fis.close(); 

    } 
} 

我想編寫一個測試:

@Test 
public void test() { 
    FileInputStreamDemo.main("file.txt"); 
    // test here, if input stream to file is closed correctly 
} 

儘管此代碼示例沒有多大意義,我想現在怎麼樣編寫一個JUnit測試來檢查FIS是否已關閉。 (如果可能的話:甚至沒有參考原始FIS對象)

回答

3

您應該創建一個名爲MyFileReader的單獨的類,它可以完成讀取文件的工作。然後創建一個MyFileReaderTest類來實例化你的新類並調用其中的方法來測試它的行爲是否正確。如果您將fis作爲MyFileReader類的受保護成員,則測試可以訪問fis並驗證它是否已關閉。

而不是使用FileInputStream,你應該使用像InputStream這樣的接口,這樣你就可以創建一個MockInputStream,它不會真的創建一個文件,但會跟蹤是否調用close()。然後你可以在你的測試代碼中進行測試。

+0

事實上,這是一個很好的解決方案。如果感興趣的方法從兩個文件名中創建兩個FIS,您將如何執行此操作。如何測試,如果第一個FIS被正確關閉,第二個在創建時拋出異常? – 2012-07-11 19:48:03

+0

首先你的MockInputStream需要有時會拋出異常的能力。您可以從測試中控制它,並在其中設置一個屬性,使其引發異常。您可以在模擬對象中使用靜態變量來告訴它在嘗試實例化時引發異常。更好的方法是使用你可以做同樣的事情的工廠。然後,您可以在測試中更換工廠,以便始終引發異常。 – 2012-07-11 21:28:01