Примечание: я знаю, что есть несколько вопросов, похожих на этот, однако я не могу найти ни одного, который объясняет, как разрешить ситуацию, которую я пытаюсь разрешить.Я задам этот вопрос на конкретном примере, для которого мне нужно решение.
Рассмотрим код:
private final void writeToFile(final File parent, final String filename, final Charset charset, final String content) throws IOException {
final File file = new File(parent, filename);
if (file.exists()) {
LOG.warn("File {} already exists, file will be replaced.", file.getCanonicalPath());
if (!file.delete()) {
logAndThrow(String.format("Cannot delete file '%s'.", file.getCanonicalPath()), null);
}
}
try (final FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fos, charset)) {
writer.write(content);
}
}
Я пытаюсь написать модульный тест, чтобы вызвать выбрасываемое IOExceptionкогда код не может удалить файл.Модульный тест, который я попробовал, выглядит следующим образом:
@Test public void testFileNotDeletable() throws IOException {
final File file = new File(folder.getRoot(), formattedFile.getMetaData().getFormattedCaptureFileName());
file.createNewFile();
try {
file.setReadOnly();
exception.expect(IOException.class);
exception.expectMessage(String.format("Cannot delete file '%s'.", file.getCanonicalPath()));
writer.write(formattedFile);
} finally {
file.setWritable(true);
}
}
Я также пытался заблокировать файл:
@Test public void testFileNotDeletable() throws IOException {
final File file = new File(folder.getRoot(), formattedFile.getMetaData().getFormattedCaptureFileName());
file.createNewFile();
try (FileInputStream fis = new FileInputStream(file)) {
final FileLock lock = fis.getChannel().tryLock(0L, Long.MAX_VALUE, true);
try {
exception.expect(IOException.class);
exception.expectMessage(String.format("Cannot delete file '%s'.", file.getCanonicalPath()));
writer.write(formattedFile);
} finally {
lock.release();
}
}
}
Независимо от того, что я пытаюсь, file.delete () успешно удаляетфайл и тест не пройден, так как ожидаемое исключение IOException не было выдано.
Любая помощь с благодарностью.
Примечание: добавлен для пояснения некоторый дополнительный код, который показывает, что объект File полностьюотдельно в окружающей среде.Файл formattedFile, передаваемый методу записи, не является File или подклассом File, это один из наших внутренних классов.Файл в тесте JUnit использует TemporaryFolder для корня, а formattedFile имеет элемент MetaData, который определяет имя файла.В моем тесте JUnit я пытаюсь создать пустой файл, который не может быть удален, в месте, где мой фактический код попытается записать файл.Мне нужно, чтобы file.delete () возвратил false, чтобы я мог проверить, что генерируется исключение.Поэтому я не могу издеваться над объектом File.