ディレクトリにファイルを作成するメソッドのテストを書いています。私のJUnitテストは次のようになります。
@Before
public void setUp(){
objectUnderTest = new ClassUnderTest();
//assign another directory path for testing using powermock
WhiteBox.setInternalState(objectUnderTest, "dirPathField", mockDirPathObject);
nameOfFile = "name.txt";
textToWrite = "some text";
}
@Test
public void shouldCreateAFile(){
//create file and write test
objectUnderTest.createFile(nameOfFile, textToWrite);
/* this method creates the file in mockPathObject and performs
FileWriter.write(text);
FileWriter.close();
*/
File expect = new File(mockPathObject + "\\" + nameOfFile);
assertTrue(expect.exist());
//assert if text is in the file -> it will not be called if first assert fails
}
@After
public void tearDown(){
File destroyFile = new File(mockPathObject + "\\" + nameOfFile);
File destroyDir = new File(mockPathObject);
//here's my problem
destroyFile.delete(); //why is this returning false?
destroyDir.delete(); //will also return false since file was not deleted above
}
deleteOnExit() を使用してファイルを削除できましたが、delete または deleteOnExit を使用してディレクトリを削除することはできません。このテスト スクリプトでは、他のシナリオの他のテストも実行するので、deleteOnExit は使用しません。
コードがJUnitテストではない場合、実行時にFileWriterによって作成および変更されたファイルを削除できるのに、JUnitテストスクリプトで削除できない理由がわかりません。また、テストメソッドの後にinfiniteLoopを実行してファイルを手動で削除しようとしましたが、コンテンツを変更できますが、他のプログラムがまだファイルを使用していることがわかります。
テスト中に作成されたファイルとディレクトリを削除する方法を誰かが提案してくれることを願っています。ありがとう
より明確にするために、私がテストするメソッドは、FileWriter を呼び出すこの単体テスト メソッドのようになります。
編集:テストする方法は次のとおりです
public void createFile(String fileName, String text){
//SOME_PATH is a static string which is a field of the class
File dir = new File(SOME_PATH); //I modified SOME_PATH using whitebox for testing
if(!dir.exists()){
booelan createDir = dir.mkdirs();
if(!createDir){
sysout("cannot make dir");
return;
}
}
try{
FileWriter fileWrite = new FileWriter(dir.getAbsolutePath() + "/" + fileName, true);
fileWrite.write(text);
fileWrite.close();
}
catch(Exception e){
e.printStackTrace();
}
}
他の開発者が作成したため、このメソッドを変更することはできません。テスト自動化のための単体テストを作成するように指示されました。ありがとう。