我需要为以下方法编写一个Unittest,模拟文件/目录访问以某种方式不能读取应用程序:
public void writeFile(String path) {
File f = new File(path);
//some stuff...
}
我如何单独测试这个设置,如果我只能提供一个Path并且不能影响甚至知道( blackbox )“writeFile(String path)”的开发者如何实现文件访问,我只知道方法签名并且读取文件。
基本上,我需要知道是否可以对文件系统进行JUnit“拦截”请求,并根据要访问的路径做出反应。 或者是在unittest中实际创建文件的唯一可能性,单元测试本身是不可能的?在这种情况下,单元测试如何“清理”后呢?
我对使用常见Mocking框架或JUnit的所有解决方案持开放态度。
提前感谢,
BillDoor
答案 0 :(得分:0)
基本上,你不能。有两个问题:
单元测试/模拟不是黑盒测试,在某种程度上你必须知道你正在测试的功能内部发生了什么。
没有用于模拟开发人员可能编写的调用的通用机制。需要编写函数以使其可测试。如果开发人员不这样做,不要期望能够为它编写一个不错的单元测试。
实际上你必须编写更多的集成:传入有效路径,调用函数,检查文件是否存在,删除文件。同样,您可以传递无效路径添加,确保您获得预期的行为。
如果您想进行一些实验,可以尝试使用jimfs,甚至尝试使用AspectJ来拦截对文件系统API的调用。但是在这种情况下它们都不现实,真正的解决方案是让开发人员编写可测试的代码。