Java
JUnit

JUnitのTemporaryFolderで一時ディレクトリを使う

More than 3 years have passed since last update.

ファイルを生成/更新するクラスをテストする際には、次回の実行時や他のテストの実行に影響がでないように、後処理で作業ディレクトリを元の状態に戻しておかなければならない。

こういう時はorg.junit.rules.TemporaryFolderを使うと、テストメソッドを実行する度に一時ディレクトリを作成して終了時には自動的に削除してくれるようになる。

使い方

テストクラスにTemporaryFolder型のpublicフィールドを作成して@Ruleアノテーションを付けておけば、テストメソッドが実行される度に一時ディレクトリを生成してくれる。

    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();

生成された一時ディレクトリのパスはgetRoot()で取得できる。

    tempFolder.getRoot();

一時ディレクトリ内にファイルやサブディレクトリを作成するにはcreateFile()createFolder()を使用する。
引数がないほうを使うとランダムな名前を付けて作成してくれる。

    tempFolder.createFile(filename);
    tempFolder.createFolder(foldername);
    tempFolder.createFile();
    tempFolder.createFolder()

テスト用ファイルを用意してある場合には、一時ディレクトリにファイルをコピーしてから使用すれば、ファイルを更新/削除するようなテストでも次回実行時に影響しない。

        FileUtils.copyDirectory(new File("src/test/data/test1/"), tempFolder.getRoot());

サンプル

初期処理でfoo/barの2ファイルを生成し、各テストメソッドで別々のファイルを削除してみるテスト。
一時ディレクトリはテストメソッド毎に生成されるので、他のテストメソッドの影響を受けていないことが確認できる。

TemporaryFolderExampleTest.java
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;

import java.io.File;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class TemporaryFolderExampleTest {

    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();

    @Before
    public void before() throws Exception {
        tempFolder.newFile("foo");
        tempFolder.newFile("bar");
    }

    @Test
    public void testDeleteFoo() throws Exception {
        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(true));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(true));

        new File(tempFolder.getRoot(), "foo").delete();

        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(false));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(true));
    }

    @Test
    public void testDeleteBar() throws Exception {
        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(true));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(true));

        new File(tempFolder.getRoot(), "bar").delete();

        assertThat(new File(tempFolder.getRoot(), "foo").exists(), is(true));
        assertThat(new File(tempFolder.getRoot(), "bar").exists(), is(false));
    }
}