2017-04-04 137 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流处理