java - 当文件存在且无法删除时如何测试方法异常?

标签 java file junit file-permissions

我想测试这段代码引发的异常:

private void delete(final File file, final String fileName) {
    boolean deleted = file.delete();
    if (deleted) {
        log.info("File {} was deleted", fileName);
    } else {
        throw new RuntimeException("The file exists but could not be deleted");
    }
}

我的第一个想法是创建一个在单元测试中无法删除的临时文件。当然,我想控制这种行为以在测试后删除该文件。但我认为这是不可能的,这是矛盾的。将文件设置为“只读”不适用于这种情况。

那么,有什么想法吗?

我可以创建一个新类并传递删除文件并返回 boolean 值的责任,这样我就可以模拟它并测试我的异常。但在执行此操作之前,我想探索使用 Junit 和 Java 的另一种可能性。

最佳答案

我认为创建临时文件或锁定文件是多余的,不是必需的。
文件无法删除的事实取决于托管该文件的文件系统的运行时条件。您不需要在单元测试中重现这些条件,而且在单元测试中重现这些条件并不能保证运行时使用的文件不可删除。所以我认为单元测试中不应该考虑这一点。

您可以简单地模拟/ stub File.delete() 使其返回 false 并断言抛出 RuntimeException :实际的断言的行为。

以 Mockito 为例:

@RunWith(MockitoJUnitRunner.class)    
public class FileServiceTest {

    @Test(expected = RuntimeException.class)
    public void myMethodToTest() throws Exception {         
        File file = Mockito.mock(File.class);
        Mockito.when(file.delete()).thenReturn(false);          
        FileService.delete(file, "test");
    }
}

关于java - 当文件存在且无法删除时如何测试方法异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49921791/

相关文章:

java - 在 JUnit 中使用 @SuiteClasses 注释和使用类数组之间的区别

java - 将字符串数组中的项目与 HashMap 的 ArrayList 中的项目进行比较

c++ - fread/fwrite 大小和计数

java - 对 SpringBatch FieldSetMapper 进行单元测试

java - 当方法调用实际返回某些东西时,有没有办法让 Mockito doNothing()

apache - 我可以使用 Apache NIFI 将文件传输到 HDFS 系统吗?

java - 如何知道是否有其他窗口使用相同的 JSESSIONID?

java - 应用程序无法在 ADB 上运行

java - 连接池泄漏原因

android - 如何连接2个文件