调用FileWriter的单元测试方法

时间:2012-08-09 07:35:01

标签: java file file-io junit mocking

我正在尝试为调用FileWriter的方法编写单元测试。我正在使用JUnit 4.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时调用该方法时可能发生的情况。但是,我无法修改我正在测试的代码,因为其他开发人员创建了它们(虽然我认为开发人员有责任创建单元测试)。

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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