【发布时间】:2018-06-12 16:56:57
【问题描述】:
注意:我知道有几个与此类似的问题,但是,我找不到任何解释如何解决我正在尝试解决的情况的问题。我会用一个具体的例子来问这个问题,我需要一个解决方案。
考虑代码:
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 对象在环境中是完全独立的。传递给 write 方法的 formattedFile 不是 File 或 File 的子类,它是我们的内部类之一。 JUnit 测试中的 File 使用 TemporaryFolder 作为根,formattedFile 有一个 MetaData 项,它确定文件名。在我的 JUnit 测试中,我试图在我的实际代码将尝试写入文件的位置创建一个无法删除的空文件。我需要 file.delete() 返回 false,以便我可以测试是否抛出异常。因此,我无法模拟 File 对象。
【问题讨论】:
-
模拟对
file.delete()的调用。 -
您使用旧文件 api 而不是围绕
Files、Paths和Path旋转的现代 NIO 有什么原因吗? -
使用不允许删除的文件权限。
-
我确实查看了 Files 接口,但是我不想使用引发 IOException 的机制,我想使用已经封装了逻辑的机制,如果成功则简单地返回 true/false . Files.deleteIfExists() 没有给我我想要的。