LoginSignup
6
11

More than 5 years have passed since last update.

JUnitのTemporaryFolderルールのディレクトリやファイルの出力先

Last updated at Posted at 2016-06-26

業務でJUnitのTemporaryFolderルールを使う機会があって、その時のディレクトリやファイルの出力先ってどこなんだっけ?ってなったので調べてみた。
ちなみに、TemporaryFolderルールとは、テストメソッドを実行する度に一時ディレクトリを作成して終了時には自動的に削除してくれる、といった優れもので、テストコードの中でファイル操作のテストをする時なんかはかなり使えそうなルール。詳細な説明はJUnitのTemporaryFolderで一時ディレクトリを使うや、テストのときに一時的なファイルを作成するにお任せする。

どこに出力されるのか?

いきなり結論だが、デフォルトではシステムプロパティーjava.io.tmpdirで指定されているところに出力される。UNIXの場合はこのプロパティーのデフォルト値は通常"/tmp"または"/var/tmp"になっているのでそこに出力される。Windowsの場合は通常、"C:\WINNT\TEMP"だが、JVMを起動した時にこのシステムプロパティーに別の値が指定されることがあるのでそこに出力される。

Windowsで試してみる

まずはシステムプロパティーjava.io.tmpdirがどこか確認し、その中にファイルが作成されるか確認してみる。

HogeTest.java
package example;

import java.io.IOException;

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

public class HogeTest {

    @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();

    @Test
    public void testGetHoge() throws IOException {

        System.out.println(System.getProperty("java.io.tmpdir"));

        temporaryFolder.newFile("hoge.txt");

        System.out.println("for break point");
    }
}

自分の家PC(Windows10)では、システムプロパティーjava.io.tmpdirは「C:\Users\N\AppData\Local\Temp\」だった。その中に「junit2901515886398757993」みたいなディレクトリが自動的に作成され、その中に「hoge.txt」が作成されていた。

TemporaryFolderクラスのソースを確認

TemporaryFolderルールを利用する場合、テストメソッド実行時の一番最初にTemporaryFolderクラスのbeforeメソッドが実行される。

TemporaryFolder.java

private final File parentFolder;
private File folder;

public TemporaryFolder() {
    this(null);
}

public TemporaryFolder(File parentFolder) {
    this.parentFolder = parentFolder;
}

protected void before() throws Throwable {
    create();
}

~~

public void create() throws IOException {
    this.folder = createTemporaryFolderIn(this.parentFolder);
}

public File newFile(String fileName) throws IOException {
    File file = new File(getRoot(), fileName);
    if (!file.createNewFile()) {
        throw new IOException("a file with the name '" + fileName
                + "' already exists in the test folder");
    }
    return file;
}

~~

private File createTemporaryFolderIn(File parentFolder) throws IOException {
    File createdFolder = File.createTempFile("junit", "", parentFolder);
    createdFolder.delete();
    createdFolder.mkdir();
    return createdFolder;
}

public File getRoot() {
    if (this.folder == null) {
        throw new IllegalStateException(
                "the temporary folder has not yet been created");
    }
    return this.folder;
}

createTemporaryFolderInメソッドで、File.createTempFile("junit", "", parentFolder);とあるように、FileクラスのcreateTempFileで一時ディレクトリを作成している。なので、FileクラスのcreateTempFileメソッドを見れば良いだけ。
また、ファイル作成についてもnewFileメソッドは内部でFileクラスのcreateNewFileを使っているので詳細はFileクラスのcreateNewFileメソッドを見れば良いだけ。

6
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
11