Насмешливый 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 и вы можете отделить тестирование обработки файлов от тестирования потоковой обработки

Другие вопросы по тегам