2017-04-04 17 views
-2

FileOutputStreamをモックしようとしていますが、FileからisInvalidメソッドをモックできないため、NullPointer Exceptionで失敗します。 まず私はモックとしたいコード: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を使用せずにこれを修正する別の方法がありますか?

また、mockの代わりにspyをclsFileOutputStreamに使用しようとしましたが、0 argsのコンストラクタがないため、これは機能しません。あなたは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 
    } 
} 

FileOutputStreamを交換しようとすることができます

+2

なぜあなたは最初にうまく動作するJDKクラスのテストを記述しますか? –

+0

@ M.Prokhorov私はFileまたはFileOutputStreamをテストしていません。私は自分のプログラムでそれらを使用し、彼らがうまく動作するので、それらを嘲笑したい。他のコードをテストすることはより重要です。したがって、私はFileとFileOutputStreamを簡単に操作する必要があります。 – Ganymed

+0

このテストでは、実際には模擬できないものを模倣する能力に依存しているようです。私は、その部分、またはリファクタの統合テストを書くことを提案して、プロセスでJDKの半分をモックする必要はありません。 –

答えて

0

あなたは

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を模擬する方が簡単ですし、テストからファイル処理のテストを区切ることができますストリーム処理

関連する問題