模拟/单元测试文件操作

时间:2014-09-15 13:51:43

标签: java junit unit-testing

我需要为以下方法编写一个Unittest,模拟文件/目录访问以某种方式不能读取应用程序:

public void writeFile(String path) {
    File f = new File(path); 
    //some stuff...
}

我如何单独测试这个设置,如果我只能提供一个Path并且不能影响甚至知道( blackbox )“writeFile(String path)”的开发者如何实现文件访问,我只知道方法签名并且读取文件。

基本上,我需要知道是否可以对文件系统进行JUnit“拦截”请求,并根据要访问的路径做出反应。 或者是在unittest中实际创建文件的唯一可能性,单元测试本身是不可能的?在这种情况下,单元测试如何“清理”后呢?

我对使用常见Mocking框架或JUnit的所有解决方案持开放态度。

提前感谢,

BillDoor

1 个答案:

答案 0 :(得分:0)

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

  1. 单元测试/模拟不是黑盒测试,在某种程度上你必须知道你正在测试的功能内部发生了什么。

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

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

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