2017-04-04 135 views
-2

所以我試圖嘲笑一個FileOutputStream,但它與NullPointer異常失敗,因爲我不能從文件模擬方法isInvalid。 首先代碼中,我想嘲笑:嘲諷FileOutputStream

FileOutputStream fos = null; 
fos = createFileOutputStream(file) 

...

public FileOutputStream createFileOutputStream(File clsFile) throws FileNotFoundException 
{ 
    return new FileOutputStream(clsFile); 
} 

我與嘲笑:

File clsFile = Mockito.mock(File.class); 
Mockito.when(clsUnitUnderTest.createNewFile(strTargetPath + "XXX" + strTargetFileName)).thenReturn(clsFile); 
Mockito.when(clsFile.exists()).thenReturn(true); 
Mockito.when(clsFile.createNewFile()).thenReturn(true); 
Mockito.when(clsFile.renameTo(new File(strTargetPath + strTargetFileName))).thenReturn(false); 
Mockito.when(clsFile.getPath()).thenReturn(strTargetPath + "XXX" + strTargetFileName); 

// Mockito.when(clsFile.isInvalid).thenReturn(false); not working because isInvalid is final!! 

FileOutputStream clsFileOutputStream = Mockito.mock(FileOutputStream.class); 
Mockito.when(clsUnitUnderTest.createFileOutputStream(clsFile)).thenReturn(clsFileOutputStream); 

我知道有沒有辦法嘲笑最終方法isInvalid。但有沒有另一種方法來解決這個問題,而不使用PowerMokito?

我也嘗試使用間諜,而不是模擬clsFileOutputStream,但這是行不通的,因爲沒有0參數的構造函數。

+2

你爲什麼首先爲良好的JDK類編寫測試? –

+0

@ M.Prokhorov我沒有測試File或FileOutputStream。我在我的程序中使用它們,並且想嘲笑它們,因爲它們表現良好。測試其他代碼更重要,因此我需要輕鬆操作File和FileOutputStream的可能性。 – Ganymed

+0

你的測試似乎依賴於模擬在這種情況下不能真正嘲笑的東西的能力。我可能會建議爲該部分編寫集成測試,或者重構,這樣您就不必在過程中模擬一半的JDK。 –

回答

0

,你可以嘗試用OutputStream

而不是

public class MyClass { 
    public FileOutputStream createFileOutputStream(File clsFile) throws FileNotFoundException 
    { 
     return new FileOutputStream(clsFile); 
    } 

    void doSomething(File file) { 
     // process file 
     .... 
     FileOutputStream str = createFileOutputStream(file); 

     // process stream 
    } 
} 

你有

public class MyClass { 
    public OutputStream createFileOutputStream(File clsFile) throws FileNotFoundException 
    { 
     return new FileOutputStream(clsFile); 
    } 

    void doSomething(File file) { 
     // process file 
     .... 
     OutputStream str = createFileOutputStream(file); 
     doSomething(str); 
    } 

    void doSomething(OutputStream stream) { 
     // process stream 
    } 

} 

這是比較容易嘲笑OutputStream,您可以單獨從測試文件處理的測試,以取代FileOutputStream流處理