我对模拟非常陌生,而且我一直在尝试模拟实际的内容(本质上是单独在内存中创建一个虚拟文件),这样在任何时候都不会将数据写入磁盘。
我已经尝试了一些解决方案,比如模拟文件和模拟尽可能多的属性,然后用文件写入器/缓冲区写入器写入文件,但这些方法都不能很好地工作,因为它们需要规范的路径。有没有人找到了不同于此或类似的解决方案,但我的方法是错误的?
我一直是这样做的:
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处理类。
发布于 2018-05-15 04:41:20
模拟I/O调用的一种方法(在Java7中是NIO的最后一个类java.nio.file.Files
)是将所需的调用包装在您自己的类中并模拟它:
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
中:
FileHelper fileHelperMock = Mockito.mock(new FileHelper());
ImageManager imageManager = new ImageManagerImpl(fileHelperMock);
测试将在您的模拟上验证对createDirectory()
方法的调用:
imageManager.save("directory");
Mockito.verify(fileHelperMock).createDirectory("directory");
我会在测试驱动的开发中使用这种方法,因为我不想用真实的文件管理来污染测试(例如,在每个单元测试中删除在finally块中创建的目录/文件)。
然后,我将使用实际的文件处理来对每个用例进行验收测试。
发布于 2021-07-15 00:37:07
另一种方法是在@Before
块中生成一个临时文件,然后使用@After
方法将其删除。
https://stackoverflow.com/questions/17681708
复制相似问题