我正在尝试为调用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。我可以用它来代替文件来创建文件夹和文件吗?
感谢。
答案 0 :(得分:2)
您可以将文件名更改为“user.name
。test-file”,然后读取文件并在完成后将其删除。
能够更改静态路径会更有用,但如果这是问题,您可以使用“../../../../../../../tmp/user.name。 file“作为文件名并有效地忽略静态路径。 ;)
BTW:catch(Exception e)
是一个非常糟糕的主意。你最好删除它恕我直言。
答案 1 :(得分:1)
我认为模拟一些在方法体内创建的对象是不正确的,并且在方法完成后将被取消引用。我认为测试已实现的接口而不是实现细节本身是一种好的做法。在您的情况下,您可以模拟someStaticString
,对我来说,这比模仿File
或FileWriter
要好得多。