8

ディレクトリにファイルを作成するメソッドのテストを書いています。私の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();
           }

    }

他の開発者が作成したため、このメソッドを変更することはできません。テスト自動化のための単体テストを作成するように指示されました。ありがとう。

4

4 に答える 4

12

@Rule アノテーションと、TemporaryFolder削除する必要があるフォルダーのクラスを使用します。

http://kentbeck.github.com/junit/javadoc/4.10/org/junit/Rule.html (404 が見つかりません)

http://junit.org/junit4/javadoc/4.12/org/junit/rules/TemporaryFolder.htmlによる使用例の更新:

public static class HasTempFolder {

  @Rule
  public TemporaryFolder folder= new TemporaryFolder();

  @Test
  public void testUsingTempFolder() throws IOException {
    File createdFile= folder.newFile("myfile.txt");
    File createdFolder= folder.newFolder("subfolder");
    // ...
  }

}
于 2012-08-09T13:09:02.147 に答える
7

これは私が通常ファイルをクリーンアップする方法です:

@AfterClass
public static void clean() {
    File dir = new File(DIR_PATH);
    for (File file:dir.listFiles()) {
        file.delete();
    }
    dir.delete();
}

ディレクトリを削除するには、ディレクトリが空である必要があります。他のテスト方法でディレクトリがさらに作成されていないことを確認してください。

finallyブロックでFileWriterインスタンスを閉じていることを確認してください

于 2012-08-09T13:32:43.620 に答える
2

objectUnderTest.createFile(nameOfFile, textToWrite)メソッドが開いているストリームを実際に閉じることを確認しますか?

于 2012-08-09T13:09:18.787 に答える
0

最善のアプローチは、JVM の終了後に削除することだと思います。

Path tmp = Files.createTempDirectory(null);
tmp.toFile().deleteOnExit();
于 2019-12-27T13:20:44.220 に答える