【发布时间】:2011-08-07 01:47:07
【问题描述】:
我在一个大量使用 IO 操作(在本例中为文件系统)的项目中引入测试。系统不断打开/关闭文件,检查文件是否存在,删除它们等等。
很快就很明显,定期模拟不会有太大用处,因为这会使我的测试难以设置和推理。另一方面,拥有一个假文件系统会很棒,而且我认为它很容易设置。
似乎 ruby 人又做了一次,这正是我在 ruby 中所要求的:http://ozmm.org/posts/fakefs.html。
Java 有什么类似的东西吗?
【问题讨论】:
-
它看起来像是在没有静态类型系统的语言中更容易实现的应用程序级别。在 Java 中,File/FileInputStream/FileOutputStream 总是引用底层系统的文件系统——如果你不修补 VM。
-
有JavaFileManager 或FileSystemView 之类的接口可以实现,但大多数程序不会使用它们。
-
@1st 评论:我很清楚这一点。我目前已将 File 的所有用途替换为我自己的 Filename,该文件名仅包含文件名作为字符串。所有的 IO 逻辑都集中在一个 IFileSystem 接口上。我遇到的问题是,按照我需要的方式实现假文件系统仍然需要一整天的工作(支持文件+文件夹+隐藏文件+重命名+仅从文件名中获取路径+ ...) 并对其进行测试,以知道它实际上是正确的。
-
既然你在 OP 中提到了 Ruby,我想在这里补充一点,C# 中也有一个等价物,System.IO.Abstractions,我最近开始使用它并且非常好。
标签: java unit-testing testing mocking