当文件存在且无法删除时如何测试方法异常?
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】:使用不同的文件并在该文件上测试删除。第二个文件的扩展名可以相同,但内容和位置可能不需要。
【讨论】:
以上是关于当文件存在且无法删除时如何测试方法异常?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel PHPUnit测试运行产生异常创建调度程序后无法设置默认工厂