なんだかいつの日か、JUnitで使うテスト用のFileVisitorを作ってメモってたので、
ブログとして残しておく。
(イマドキはこういうのはgistとかにさっと書いてメモるもんなのかなぁ…)
大体、JUnitでのテストでネックとなるのが
・どうでもいいファイルをテストの間だけ作成する
・画像ダウンロードとかファイル出力とかのロジックで出来たファイルの検証がややこしい
・どうでもいいファイルをテストが終わったら削除する
とかだと思ってる。
今回はどうでもいいファイルを削除することと、
検証の方法の1つとして、生成されたファイル数をカウントするという
雑なVisitorを作ってみた。
ファイル数カウントVisitorクラス
import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.List; public class FileCountVisitor implements FileVisitor<Path> { private List<Path> list; public FileCountVisitor(List<Path> list) { this.list = list; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { list.add(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } }
生成ファイルアサーション用のクラス
import static org.junit.Assert.fail; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class FileTester { private FileTester() { } private static List<Path> createPathList(String pathString) throws IOException { final List<Path> list = new ArrayList<>(); Path path = Paths.get(pathString); Files.walkFileTree(path, new FileCountVisitor(list)); return list; } public static boolean exists(String pathString) throws IOException { return !createPathList(pathString).isEmpty(); } public static int count(String pathString) throws IOException { final List<Path> list = createPathList(pathString); if (list.isEmpty()) { fail("capture failed"); } return list.size(); } }
ファイル削除Visitor(テストの後始末)クラス
import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; public class DeleteVisitor extends SimpleFileVisitor<Path> { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) throws IOException { System.out.println("delete file : " + path.getFileName()); Files.delete(path); return checkNotExist(path); } @Override public FileVisitResult postVisitDirectory(Path path, IOException exception) throws IOException { if (exception == null) { System.out.println("delete directory : " + path.getFileName()); Files.delete(path); return checkNotExist(path); } else { throw exception; } } private FileVisitResult checkNotExist(final Path path) throws IOException { if (!Files.exists(path)) { return FileVisitResult.CONTINUE; } else { throw new IOException(); } } }
そして、これらを使って、JUnitでファイル生成のテストを行うとこんな感じ。
import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import org.junit.After; import org.junit.Test; public class VisitorTest { @Test public void ほげほげなファイルを5個作る() throws IOException { // setup final String pathString = "usr/local/hoge"; // exercise (hogehogeなファイルを作る) generateFileHoge(pathString); // verify (ほげほげなファイルが5個作られているか確認) assertThat(FileTester.count(pathString), is(5)); } @After public void teardown() throws IOException { final String pathString = "usr/local/hoge"; // 作ったファイルは消してテスト前の状態に戻す Files.walkFileTree(Paths.get(pathString), new DeleteVisitor()); } }
1 件のコメント:
こんにちは。
ファイル作成のtestの後始末、自動化できるのは素晴らしいです!
コメントを投稿