繁体   English   中英

关于Java模拟文件的建议(模拟java.io.File)

[英]Suggestions for a java Mock File (to mock java.io.File)

有人对Java模拟File对象有建议吗? 我正在使用需要获取java.io.File对象作为参数的第三方类。 我通过网络服务(也是其产品之一)以流的形式接收此文件的数据。

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

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

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

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

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

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

从单元测试的角度来看,模拟对象更有意义。 您的目标不是单元测试第三方库函数,而是单元测试doSomething()方法。 因此,您可以围绕第三方函数创建包装器。也许像这样,

public class Wrapper implements MyWrapper{

   public Object invokeThirdPartyFunction(File file){
      new ThirdPartyCode().actualMethod(file);
   }
}

现在,您可以创建一个模拟包装器(实现相同的接口),并将此模拟包装器用于所有junit案例。

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

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

后一种情况比较棘手,而且恐怕如果输入流是由类在内部创建的,除了在HD上实际创建真实的测试文件之外,您别无选择。

您可以使用基于ASM的类加载器加载第3方代码,该类加载器将java.io.File映射到您自己的“伪”实现。 这是一项工作,需要仔细执行...例如,您还需要映射FileInputStream等。

您不使用文件(或单元测试中的任何外部依赖项)。 除了使用模拟之外,您的方法还会导致有问题的测试。 有关更多信息,请参见此Javaranch文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM