对java模拟文件(模拟java.io.File)的建议

对java模拟文件(模拟java.io.File)的建议,java,unit-testing,file,mocking,Java,Unit Testing,File,Mocking,有人对java模拟文件对象有什么建议吗? 我使用的是第三方类,它需要获取一个java.io.File对象作为参数。 我通过Web服务(也是他们的产品之一)以流的形式接收此文件的数据 一种解决方案是将所有这些数据写入一个文件,并将其提供给类。这是一个我不喜欢的解决方案:它剥夺了使用webservice而不仅仅是下载文件的优势 更快、更有效的方法是将内存中的数据放在模拟文件中,并将该模拟文件提供给第三方类 它可能必须是一个MockFile,扩展java.io.File并覆盖所有与硬盘上的文件进行实际

有人对java模拟文件对象有什么建议吗? 我使用的是第三方类,它需要获取一个java.io.File对象作为参数。 我通过Web服务(也是他们的产品之一)以流的形式接收此文件的数据

一种解决方案是将所有这些数据写入一个文件,并将其提供给类。这是一个我不喜欢的解决方案:它剥夺了使用webservice而不仅仅是下载文件的优势

更快、更有效的方法是将内存中的数据放在模拟文件中,并将该模拟文件提供给第三方类

它可能必须是一个MockFile,扩展java.io.File并覆盖所有与硬盘上的文件进行实际接口的函数


我知道第三方应该使用流作为输入参数,而不是文件。但是,这超出了我的影响。

被测试的类是只查询模拟文件的名称、属性等,还是实际尝试打开该文件

在前一种情况下,您可以使用例如或等效的模拟框架轻松创建模拟


后一种情况更加棘手,我担心如果输入流是由类内部创建的,那么除了在HD上实际创建一个真正的测试文件之外,您别无选择。

这只是基于我对您的问题的理解提出的建议。 我相信你一定是在做这样的事情

public void doSomething(){
      //Pre processing
       Object result=new ThirdPartyCode().actualMethod(file);
     //Post processing
}
public class Wrapper implements MyWrapper{

   public Object invokeThirdPartyFunction(File file){
      new ThirdPartyCode().actualMethod(file);
   }
}
从单元测试的角度来看,模拟对象更有意义。 您的目标不是对第三方库函数进行单元测试,而是对doSomething()方法进行单元测试。所以你可能可以在第三方函数周围创建一个包装器。也许类似这样的东西

public void doSomething(){
      //Pre processing
       Object result=new ThirdPartyCode().actualMethod(file);
     //Post processing
}
public class Wrapper implements MyWrapper{

   public Object invokeThirdPartyFunction(File file){
      new ThirdPartyCode().actualMethod(file);
   }
}
现在,您可以创建一个模拟包装器(实现相同的接口),并将此模拟包装器用于所有junit案例。

您不使用文件(或单元测试中的任何外部依赖项)。除了使用mock,您的方法将导致有问题的测试。
有关更多信息,请参见。您可以使用基于ASM的类加载器加载第三方代码,该类加载器将
java.io.File
映射到您自己的“伪”实现。这是一点工作,需要仔细执行。。。例如,您还需要映射
FileInputStream
,等等。

它实际上希望从文件中获取(读取)数据。因此,我正在寻找一个模拟文件的覆盖读取以及。。。从内存中读取数据(在模拟文件中)我知道这更棘手,但希望有人已经这样做了…@michel,问题是,
file
只是“文件和目录路径名的抽象表示”。所以你不能直接从中读取-你需要为此打开一个(或)。我知道,所以需要从这个模拟文件对象返回一个文件inputstream。Thanx感谢您的帮助和思考,下面的建议似乎提供了搜索到的解决方案……您向利兹建议的部分内容,我的最终结论是,我想要的事情无法实现。需要实际制作一个文件。包装器只能用于自动生成临时文件。文件为了满足我的需要,第三方必须添加一个选项来传递inputstream而不是文件。在这种情况下,这可能不是最好的解决方案,但您可以使用JMockit mocking库模拟输入流(以及几乎任何其他内容)。即使所说的流是在第三方类.Thanx中创建的,这与关于常见VFS的答案结合起来可能会起到作用。(需要类似于普通VFS的东西来创建虚拟文件,而不是在硬盘上创建文件)我不再寻找答案,但基于视图的nr,这是很多人都面临的问题。无论如何,这个类加载器听起来是一个有趣的测试选项!我在这里看到了一些东西:也许你可以为那些打算尝试这个选项的人提供一些URL?我知道在单元测试中避免使用文件。这就是为什么我要找一个模型或者任何可以伪造文件的东西。从我对这个问题的看法来看,我不是唯一一个面临这个问题的人。我宁愿在这里做我应该做的,而不是我不应该做的(特别是如果我的问题暗示我知道我不应该做的话):)你考虑过使用吗?如上所述,这个软件包似乎提供了我正在寻找的解决方案。。。会让你知道这是否有用。谢谢所有答案。。。在我看来,模拟文件不是解决方案。。。我唯一能做的就是创建一个扩展文件对象,自动生成一个文件,并将其交给第三方类。为了我真正想要的。。。。第三方类必须接受InputStream作为参数。但这也可以通过使用关于包装器的建议来实现。第三方类只接受一个文件,这有点令人沮丧。