Java 调用FileWriter的单元测试方法

Java 调用FileWriter的单元测试方法,java,file,file-io,junit,mocking,Java,File,File Io,Junit,Mocking,我正在尝试为调用FileWriter的方法编写一个单元测试。我正在使用JUnit4.8、Powermock和Mockito。我正在测试的方法如下所示 public void methodToTest(String fileName, String text){ File file = new File (someStaticString) //string is a static field of the class and the path is a dir

我正在尝试为调用FileWriter的方法编写一个单元测试。我正在使用JUnit4.8、Powermock和Mockito。我正在测试的方法如下所示

    public void methodToTest(String fileName, String text){

          File file = new File (someStaticString) //string is a static field of the class and the path is a dir

          if(!file.exist()){ //create dir}

          try{
               FileWriter fw = new FileWrite(file.getAbsolutePath() + "/" fileName, true);
               fw.write(text);
               fw.close();
          }
          catch(Exception e){
               e.printStackTrace 
          }
    }
如果file和fileWriter是在该方法之外声明的,那么我可以使用mockito和powermock对它们进行模拟,这样我就可以测试在我练习BDD时调用该方法时可能发生的情况。然而,我不能修改我正在测试的代码,因为其他开发人员创建了它们(尽管我认为创建单元测试是开发人员的责任)

我想知道如何(如果可能的话)在file和fw这样的方法下模拟对象。在if()或loop()下是否创建了对象?他们也可以被嘲笑吗

如果我所想的是不可能的,你能推荐什么来测试这种方法?我还了解了JUnit的临时文件夹。我可以用这个代替文件来创建文件夹和文件吗


谢谢

您可以将文件名更改为类似“
user.name
test file”的格式,然后读取文件并在完成后将其删除

能够更改静态路径会更有用,但如果这是一个问题,您可以使用“../../../../../../../../../../tmp/user.name.file”作为文件名,并有效地忽略静态路径


顺便说一句:
catch(例外e)
是一个非常糟糕的主意。您最好将其删除。

我认为模拟在方法体中创建的对象是不正确的,该对象将在方法完成后取消引用。我认为测试已实现的接口是一种很好的做法,而不是测试实现细节本身。在您的例子中,您可以模拟
someStaticString
,对我来说,这似乎比模拟
File
FileWriter
要好得多