首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模拟Java中的文件-模拟内容- Mockito

模拟Java中的文件-模拟内容- Mockito
EN

Stack Overflow用户
提问于 2013-07-17 00:11:29
回答 2查看 109.9K关注 0票数 39

我对模拟非常陌生,而且我一直在尝试模拟实际的内容(本质上是单独在内存中创建一个虚拟文件),这样在任何时候都不会将数据写入磁盘。

我已经尝试了一些解决方案,比如模拟文件和模拟尽可能多的属性,然后用文件写入器/缓冲区写入器写入文件,但这些方法都不能很好地工作,因为它们需要规范的路径。有没有人找到了不同于此或类似的解决方案,但我的方法是错误的?

我一直是这样做的:

代码语言:javascript
复制
private void mocking(){
    File badHTML = mock(File.class);
    //setting the properties of badHTML
    when(badHTML.canExecute()).thenReturn(Boolean.FALSE);
    when(badHTML.canRead()).thenReturn(Boolean.TRUE);
    when(badHTML.canWrite()).thenReturn(Boolean.TRUE);
    when(badHTML.compareTo(badHTML)).thenReturn(Integer.SIZE);
    when(badHTML.delete()).thenReturn(Boolean.FALSE);
    when(badHTML.getFreeSpace()).thenReturn(0l);
    when(badHTML.getName()).thenReturn("bad.html");
    when(badHTML.getParent()).thenReturn(null);
    when(badHTML.getPath()).thenReturn("bad.html");
    when(badHTML.getParentFile()).thenReturn(null);
    when(badHTML.getTotalSpace()).thenReturn(0l);
    when(badHTML.isAbsolute()).thenReturn(Boolean.FALSE);
    when(badHTML.isDirectory()).thenReturn(Boolean.FALSE);
    when(badHTML.isFile()).thenReturn(Boolean.TRUE);
    when(badHTML.isHidden()).thenReturn(Boolean.FALSE);
    when(badHTML.lastModified()).thenReturn(System.currentTimeMillis());
    when(badHTML.mkdir()).thenReturn(Boolean.FALSE);
    when(badHTML.mkdirs()).thenReturn(Boolean.FALSE);
    when(badHTML.setReadOnly()).thenReturn(Boolean.FALSE);
    when(badHTML.setExecutable(true)).thenReturn(Boolean.FALSE);
    when(badHTML.setExecutable(false)).thenReturn(Boolean.TRUE);
    when(badHTML.setReadOnly()).thenReturn(Boolean.FALSE);

    try {
        BufferedWriter bw = new BufferedWriter(new FileWriter(badHTML));
        /*
          badHTMLText is a string with the contents i want to put into the file, 
          can be just about whatever you want
         */
        bw.append(badHTMLText);
        bw.close();

    } catch (IOException ex) {
        System.err.println(ex);
    }
}

任何想法或指导都会非常有帮助。在此之后,我基本上尝试使用另一个类从文件中读取。我会尝试模拟某种输入流,但另一个类不接受输入流,因为它是项目的io处理类。

EN

回答 2

Stack Overflow用户

发布于 2018-05-15 04:41:20

模拟I/O调用的一种方法(在Java7中是NIO的最后一个类java.nio.file.Files)是将所需的调用包装在您自己的类中并模拟它:

代码语言:javascript
复制
public class FileHelper {

    public Path createDirectory(String directoryName) throws IOException {
        return Files.createDirectory(Paths.get(directoryName));
    }

    public boolean exists(String name) throws IOException {
        return Files.exists(Paths.get(name), LinkOption.NOFOLLOW_LINKS);
    }

}

业务逻辑位于ImageManager中:

代码语言:javascript
复制
FileHelper fileHelperMock = Mockito.mock(new FileHelper());
ImageManager imageManager = new ImageManagerImpl(fileHelperMock);

测试将在您的模拟上验证对createDirectory()方法的调用:

代码语言:javascript
复制
imageManager.save("directory");
Mockito.verify(fileHelperMock).createDirectory("directory");

我会在测试驱动的开发中使用这种方法,因为我不想用真实的文件管理来污染测试(例如,在每个单元测试中删除在finally块中创建的目录/文件)。

然后,我将使用实际的文件处理来对每个用例进行验收测试。

票数 5
EN

Stack Overflow用户

发布于 2021-07-15 00:37:07

另一种方法是在@Before块中生成一个临时文件,然后使用@After方法将其删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17681708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档