Java 模拟/单元测试文件操作

Java 模拟/单元测试文件操作,java,junit,unit-testing,Java,Junit,Unit Testing,我需要为以下方法编写一个Unittest,模拟所访问的文件/目录在某种程度上对应用程序不可读: public void writeFile(String path) { File f = new File(path); //some stuff... } 如果我只能提供一个路径,不能影响甚至不知道writeFileString Path的开发者是如何实现文件访问的blackbox,那么如何对这个设置进行单元测试,我只知道方法签名和文件的读取 基本上,我需要知道是否可以向文件系

我需要为以下方法编写一个Unittest,模拟所访问的文件/目录在某种程度上对应用程序不可读:

public void writeFile(String path) {
    File f = new File(path); 
    //some stuff...
}
如果我只能提供一个路径,不能影响甚至不知道writeFileString Path的开发者是如何实现文件访问的blackbox,那么如何对这个设置进行单元测试,我只知道方法签名和文件的读取

基本上,我需要知道是否可以向文件系统发出JUnit截获请求,并根据要访问的路径做出反应。 或者,在unittest中实际创建一个文件的唯一可能性是unittest本身无法访问的吗?在这种情况下,unittest如何清理自身

我对所有使用通用模拟框架或JUnit的解决方案都持开放态度

提前感谢,


BillDoor基本上,你不能。有两个问题:

单元测试/模拟不是黑盒测试,在某种程度上,您必须知道正在测试的函数内部发生了什么

没有通用的机制来模拟开发人员可能编写的调用。函数需要编写为可测试的。如果开发人员不这样做,不要期望能够为它编写一个像样的单元测试

实际上,您必须编写更多的集成:传入有效路径,调用函数,检查文件是否存在,删除文件。同样,您可以传递一个无效的路径add,以确保获得预期的行为


如果您想尝试一下,可以尝试使用AspectJ甚至尝试使用AspectJ拦截对文件系统API的调用。然而,在这种情况下,两者都不现实,真正的解决方案是让开发人员编写可测试代码。

标准方法是将方法签名更改为接受文件而不是字符串。这是可能的吗?这是可能的,但对我来说似乎很奇怪,必须更改实际代码以满足测试需要。决策者会认为这是一种奇怪的做法,因为你不能以任何你喜欢的方式编写代码,并期望它是可测试的。在设计方法时,您需要记住这一点。在这里,情况显然不是这样,因此更改方法使其可测试是一件好事。我会记住并提出这一点,谢谢!不过,如果我没有办法影响开发者的话,我还是很感兴趣是否有可能处理这个问题