[英]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.