ファイルを生成/更新するクラスをテストする際には、次回の実行時や他のテストの実行に影響がでないように、後処理で作業ディレクトリを元の状態に戻しておかなければならない。
こういう時は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ファイルを生成し、各テストメソッドで別々のファイルを削除してみるテスト。
一時ディレクトリはテストメソッド毎に生成されるので、他のテストメソッドの影響を受けていないことが確認できる。
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));
}
}