2016-06-27 8 views
3

は、私が実際のファイルの静的メソッドを模擬することはできません私はMockitoを使用していますユニットテストの目的でjava.nio.Files用のラッパーを作成する必要がありますか?

public class TempFileWritter{ 
    public String writeToTempFile(byte[] value) throws IOException { 
     Path tempFile = Files.createTempFile(dir, prefix, suffix); 
     Files.write(tempFile, value); 
     return tempFile.toAbsolutePath().toString(); 
    } 
} 

を作成せずにクラス以下のためのユニットテストを記述しようとしています。私の現在のソリューションは、java.nio.Filesクラスのラッパークラスを書いていると私は以下のように私のクラスにそれを注入することができるように:

MyAppFileUtilsクラス:

public class MyAppFileUtils { 

    public void write(Path file, byte[] value) throws IOException { 
     Files.write(file, value); 
    } 

    public Path createTempFile(Path dir, String prefix, String suffix) throws IOException { 
     return Files.createTempFile(dir, prefix, suffix); 
    } 
} 

修正クラスは次のとおりです。

public class TempFileWritter{ 
    MyAppFileUtils fileUtils; 
    public void setFileUtils(MyAppFileUtils fileUtils) { 
     this.fileUtils = fileUtils; 
    } 
    public String writeToTempFile(byte[] value) throws IOException { 
     Path tempFile = fileUtils.createTempFile(dir, prefix, suffix); 
     fileUtils.write(tempFile, value); 
     return tempFile.toAbsolutePath().toString(); 
    } 
} 

誰かが作成するクラスMyAppFileUtilsは、クラスjava.nio.Filesのメソッドを呼び出す以外は何もしないため、冗長です。それについていくつかアドバイスをいただけますか?

答えて

2

JimFs Java 7ファイルシステムAPIのインメモリ実装を使用してください。 あなたのコードで代替のファイルシステムの実装が可能であることを確認する必要がありますが、拡張可能なコードになるはずです。

はのは、あなたのクラスは、あなたのユニットテストが

@Test 
public void testCreateTempFile() throws IOException { 
    FileSystem fs = Jimfs.newFileSystem(); 

    Path tempDir = fs.getPath("mytempdir"); 
    String prefix = "myprefix"; 
    String suffix = ".tmp"; 

    byte[] data = new byte[1]; 
    data[0] = 0x66; 

    TempFileWriter tempFileWriter = new TempFileWriter(tempDir, prefix, suffix); 
    tempFileWriter.writeToTempFile(data); 

    Files.list(tempDir).forEach(path -> { 
     String fileName = path.getName(0).toString(); 
     assertTrue(fileName.startsWith(prefix)); 
     assertTrue(fileName.endsWith(suffix)); 
     assertTrue(Files.readAllBytes(path)[0] == 0x66) 
    }); 
} 

別filesytemの実装を使用することができますので、あなたのコードは、今より拡張可能である可能性があり

public class TempFileWriter { 

    private final Path tempDir; 
    private final String prefix; 
    private final String suffix; 

    public TempFileWriter(Path tempDir, String prefix, String suffix) { 
     this.tempDir = tempDir; 
     this.prefix = prefix; 
     this.suffix = suffix; 
    } 

    public Path writeToTempFile(byte[] value) throws IOException { 
     Path tempFile = Files.createTempFile(tempDir, prefix, suffix); 
     Files.write(tempFile, value); 
     return tempFile; 
    } 
} 

のように見えるとしましょう。 何かを模擬する必要がないため、ユニットテストが改善されました。

+0

私のケースがより拡張性の高いコードになるためのアイデアやベストプラクティスを提案できますか? – Nghia

+0

私は私の答えを更新しました。私が本当に意味するのは、この例でもっと拡張可能なのは、代替ファイルシステムを訴えることができるということです。将来メモリー内のファイルシステムを使用することが望ましい場合があります。 – Magnus

+0

ご意見ありがとうございます。 JimFsを私のプロジェクトに含めることはできませんが、将来私はそれを試してみると思います。私は私のクラスのファイルシステムに直接アクセスする執筆intergationテストに終わる。 – Nghia

関連する問題