2017-04-04 5 views
-2

Also ich versuche, einen FileOutputStream zu verspotten, aber es scheitert mit einer NullPointer-Ausnahme, weil ich die Methode isInvalid aus Datei nicht verspotten kann. den Code zuerst möchte ich verspotten:Mocking FileOutputStream

FileOutputStream fos = null; 
fos = createFileOutputStream(file) 

...

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

Mein Zusammenhang Mocks:

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); 

Ich weiß, dass es keine Möglichkeit gibt, die letzte Methode isInvalid zu verspotten. Aber gibt es eine andere Möglichkeit, das zu beheben, ohne PowerMokito zu benutzen?

Ich habe auch versucht mit Spion anstelle von Mock für die ClsFileOutputStream, aber das funktioniert nicht, weil es keinen Konstruktor mit 0 Args gibt.

+2

Warum bist du Schreiben Tests für wohlerzogene JDK-Klassen an erster Stelle? –

+0

@ M.Prokhorov Ich teste nicht die Datei oder den FileOutputStream. Ich benutze sie in meinem Programm und möchte sie verspotten, weil sie sich gut benehmen. Das Testen des anderen Codes ist wichtiger und daher brauche ich die Möglichkeit, die Datei und den FileOutputStream einfach zu manipulieren. – Ganymed

+0

Ihr Test scheint sich auf die Fähigkeit zu verlassen, Dinge zu verspotten, die in diesem Fall nicht wirklich zum Vorschein kommen. Ich könnte vorschlagen, entweder Integrationstests für diesen Teil zu schreiben, oder Refactor, so dass Sie nicht die Hälfte Ihres JDK in diesem Prozess vortäuschen müssen. –

Antwort

0

können Sie versuchen, FileOutputStream zu ersetzen mit OutputStream

Statt

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 
    } 
} 

Sie haben

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 
    } 

} 

Es ist einfacher OutputStream zu verspotten und Sie können Testen von Dateiverarbeitung von Test trennen Stream-Verarbeitung