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

Posted

技术标签:

【中文标题】当文件存在且无法删除时如何测试方法异常?【英文标题】:How test an method exception when the file exists and cannot be deleted? 【发布时间】:2018-09-29 23:59:02 【问题描述】:

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

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");
    

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

那么,有什么想法吗?

我可以创建一个新类并传递删除文件并返回布尔值的职责,因此我可以模拟它并测试我的异常。但在此之前,我想探索使用 Junit 和 Java 的另一种可能性。

【问题讨论】:

使用锁应该可以防止文件被删除。所以这应该可以解决问题。 你能打开/锁定文件吗?那么它应该抛出异常。 我找不到关于这个主题已经存在的问题。谢谢! 真的不是复制品。复制是解决问题的一种方法,但我认为它不能以一般方式解决问题。 问题相关链接(不重复):***.com/questions/128038/… 【参考方案1】:

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

您可以简单地模拟/存根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");
    

【讨论】:

【参考方案2】:

一般来说,我会做以下事情:

@RunWith(MockitoJUnitRunner.class)    
public class FileServiceTest 

    @Mock
    private File file;

    @Test
    public void myMethodToTest()          
        doReturn(false).when(file).delete();
        try
            FileService.delete(file, "test");
            fail("this test should throws an exception.")
         catch (RuntimeException e) 
            assertEquals("The file exists but could not be deleted", e.getMessage());
                
    

在这个例子中,如果它没有抛出任何异常,测试就会失败,如果它得到一个 RuntimeException,它会验证那个异常是否是你抛出的那个。

【讨论】:

【参考方案3】:

在编写单元测试时使用模拟对象。

获取 Mockito 并创建文件输入参数的模拟。 然后在你的 mock 上设置 delete 方法的返回值,以根据所需的测试结果返回 true 或 false。

【讨论】:

【参考方案4】:

使用不同的文件并在该文件上测试删除。第二个文件的扩展名可以相同,但内容和位置可能不需要。

【讨论】:

以上是关于当文件存在且无法删除时如何测试方法异常?的主要内容,如果未能解决你的问题,请参考以下文章

U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法

Laravel PHPUnit测试运行产生异常创建调度程序后无法设置默认工厂

如何测试该方法不会抛出异常?

Maven 3:当文件不存在时如何将文件复制到测试目录

利用 Traceview 精准定位启动时间测试的异常方法 (工具开源)

如何从测试用例视图中删除 Xcode 测试用例?