Насмешливый FileOutputStream
Поэтому я пытаюсь смоделировать FileOutputStream, но он завершается неудачно с исключением NullPointer, потому что я не могу смоделировать метод isInvalid из File. Сначала код, который я хочу издеваться:
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?
Я также попытался использовать spy вместо mock для clsFileOutputStream, но это не работает, потому что нет конструктора с 0 аргументами.
1 ответ
Вы можете попробовать заменить FileOutputStream
с 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
и вы можете отделить тестирование обработки файлов от тестирования потоковой обработки