3

我正在尝试为调用 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。我可以用它代替文件来创建文件夹和文件吗?

谢谢。

4

2 回答 2

2

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

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

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

于 2012-08-09T07:40:57.240 回答
1

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

于 2012-08-09T07:42:46.870 回答