業務でJUnitのTemporaryFolderルールを使う機会があって、その時のディレクトリやファイルの出力先ってどこなんだっけ?ってなったので調べてみた。
ちなみに、TemporaryFolderルールとは、テストメソッドを実行する度に一時ディレクトリを作成して終了時には自動的に削除してくれる、といった優れもので、テストコードの中でファイル操作のテストをする時なんかはかなり使えそうなルール。詳細な説明はJUnitのTemporaryFolderで一時ディレクトリを使うや、テストのときに一時的なファイルを作成するにお任せする。
どこに出力されるのか?
いきなり結論だが、デフォルトではシステムプロパティーjava.io.tmpdirで指定されているところに出力される。UNIXの場合はこのプロパティーのデフォルト値は通常"/tmp"または"/var/tmp"になっているのでそこに出力される。Windowsの場合は通常、"C:\WINNT\TEMP"だが、JVMを起動した時にこのシステムプロパティーに別の値が指定されることがあるのでそこに出力される。
Windowsで試してみる
まずはシステムプロパティーjava.io.tmpdirがどこか確認し、その中にファイルが作成されるか確認してみる。
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メソッドが実行される。
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メソッド](https://docs.oracle.com/javase/jp/6/api/java/io/File.html#createTempFile(java.lang.String, java.lang.String, java.io.File))を見れば良いだけ。
また、ファイル作成についてもnewFileメソッドは内部でFileクラスのcreateNewFileを使っているので詳細はFileクラスのcreateNewFileメソッドを見れば良いだけ。