読者です 読者をやめる 読者になる 読者になる

Javaでファイル操作(nio2)のユニットテストを書く

Javaでファイル操作をするときに、nio2とjimfsを使えばいい感じにファイル操作のユニットテストが書けることがわかったのでメモ

nio2
Javaファイル関連メモ2(Hishidama's Java Files Memo)

jimfs
Maven Repository: com.google.jimfs » jimfs
GitHub - google/jimfs: An in-memory file system for Java 7+

nio2はファイル操作を抽象化しており、zipやFTP先のサーバなども仮想的なファイルシステムとして利用できる
そのため、オンメモリな仮想ファイルシステムで差し替えることができれば、ローカルのファイルシステムを操作するコードも、
ローカルファイルを汚さずにテストすることができる

例:/rootdirectory/output/result.out ファイルに"Hello nio2"と出力するコード

プロダクトコード

public void method() {
    Path outputDirectory = Paths.get("/rootdirectory/output");
    if (!Files.exists(outputDirectory)) {
        Files.createDirectories(outputDirectory);
    }

    Files.write(outputDirectory.resolve("result.out"), "Hello nio2".getBytes());
}

テストコード
JMockitでモックしてファイルシステムを差し替えている

@Mocked
Paths paths;

@Test
public void 中間ディレクトリがなければ作ってファイルを作成する() throws IOException {

    try(FileSystem dummyFS = Jimfs.newFileSystem(Configuration.unix())) {

        // JMockitでPaths.getでファイルシステムを差し替える
        new NonStrictExpectations(){{
            Paths.get("/rootdirectory/output");
            result = dummyFS.getPath("/rootdirectory/output");
        }};
            
        testTarget.method();
        
        // 差し替えられたファイルシステムにファイルが作られているかアサーションする
        Path createdFilePath = dummyFS.getPath("/rootdirectory/output/result.out");
        assertThat(Files.exists(createdFilePath), is(true));
        assertThat(new String(Files.readAllBytes(createdFilePath)), is("Hello nio2"));
    }
}

以上