Прежде всего рассмотрите возможность использования IOUtils.closeQuietly()
, что уменьшит ваш непроверенный код (и, возможно, дублирование) до:
try {
f = new BufferedInputStream(new FileInputStream(source));
f.read(buffer);
} finally {
IOUtils.closeQuietly(f);
}
Теперь это становится сложным.Путь " right " состоит в том, чтобы вывести BufferedInputStream
в другой класс и внедрить макет.Имея макет, вы можете проверить, был ли вызван соответствующий метод close()
. Ответ
@ JeffFoster довольно близок к тому, что я имею в виду, однако я бы порекомендовал состав вместо наследования (наза счет дополнительного кода):
try {
f = fileSystem.open(source);
f.read(buffer);
} finally {
IOUtils.closeQuietly(f);
}
Где fileSystem
- это экземпляр интерфейса FileSystem
с простой реальной реализацией, внедренной в производственный код или макет для тестирования.
interface FileSystem {
InputStream open(String file);
}
ДругойПреимущество внешнего открытия файла состоит в том, что если вы решите удалить буферизацию или добавить шифрование, вам нужно будет изменить только одно место.
Имея этот интерфейс, вы создаете свой тестовый код с помощью mock (используя Mockito):
//given
FileSystem fileSystemMock = mock(FileSystem.class);
InputStream streamMock = mock(InputStream.class);
given(fileSystemMock.open("file.txt")).willReturn(streamMock);
//when
//your code
//then
verify(streamMock).close();