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

时间:2010-06-30 09:45:55

标签: java unit-testing file mocking

有没有人对java mock File对象有什么建议? 我使用的是需要获取java.io.File对象作为参数的第三方类。 我通过webservice(也是他们的产品之一)在流中接收该文件的数据。

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

更快更有效的方法是将这些数据从内存放入Mock文件中,并将此Mock文件提供给第三方类。

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

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

4 个答案:

答案 0 :(得分:5)

这只是基于我对您的问题的理解的建议。 我相信,你必须做这样的事情,

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情况。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您不使用文件(或单元测试中的任何外部依赖项)。除了使用模拟之外,您的方法将导致有问题的测试。 有关详情,请参阅this javaranch article