2012-08-09 154 views
2

我正在尝试为调用FileWriter的方法编写单元测试。我正在使用JUnit 4.8,Powermock和Mockito。我正在测试的方法看起来像这样。调用FileWriter的单元测试方法

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 
      } 
    } 

如果文件和FileWriter的是在方法外声明,我可以用和的Mockito嘲笑powermock他们,所以我可以测试方法被调用,因为我练BDD可能发生的可能出现的情况。但是,我无法修改自其他开发人员创建它们以来所测试的代码(尽管我认为开发人员有责任创建单元测试)。

我想知道如何(如果可能的话)在文件和fw之类的方法下模拟对象。如果在if()或loop()下创建对象,那么该怎么办?他们也可以被嘲笑吗?

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

谢谢。

回答

2

您可以将文件名更改为“user.name .test-file”之类的内容,并读取文件并在完成后将其删除。

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

BTW:catch(Exception e)是一个非常糟糕的主意。你最好删除它恕我直言。

1

我认为模拟一些在方法体内创建的对象并且在方法完成后将取消引用是不正确的。我认为测试已实现的接口是一种很好的做法,但不是实现细节本身。在你的情况下,你可以模拟someStaticString,这似乎比嘲笑FileFileWriter好得多。