0

FilePOJOに参照を挿入する必要がある興味深いシナリオがあります(テストクラスでは、をスタブしFileて実際にはディスクに何も書き込まないようにするため)が、ファイルの名前は実際には次のようになります。ランタイム:

public class MyPOJO {
    private File file;

    private FileWriter writer;

    // Getter and setter for file & writer

    public void writeToDisk(String message) {
        String fileName = complexLogicToBuildFileName();

        // How do I do the equivalent of: file.setName(fileName);

        try {
            writer.write(message);

            writer.close();
        } catch(IOException ioe) {
            ...
        }
    }
}

public class MyPOJOTest {
    @Test
    public void verifyWriteToDiskAttemptsToWrite() {
        MyPOJO pojo = new MyPOJO();
        File mockFile = Mockito.mock(File.class);
        FileWriter mockWriter = Mockito.mock(FileWriter.class);

        Mockito.doNothing().when(mockWriter).write(Mockito.anyString());

        pojo.setWriter(mockWriter);
        pojo.setFile(mockFile);

        pojo.writeToDisk("This won't write to disk.");

        Mockito.verify(mockWriter).write("This won't write to disk.");
    }
}

問題は、コンストラクターが強制されているため、実行するに、挿入されたインスタンスをファイル名にFile(String)バインドする必要があり、これを単純なsetterメソッドで上書きできないことです。(テスト容易性のために)プロパティを保持して注入する方法についてのアイデアはありますが、それでもファイルに名前を付けるために使用できますか?前もって感謝します。FilecomplexLogicToBuildFileName()filefileWritercomplexLogicToBuildFileName()

4

1 に答える 1

2

File なぜaとaを挿入しているのかわかりません。FileWriterまた、POJOは(を介してcomplexLogicToBuildFileName())ファイル名も取得します。

文章を抽象化したい場合は、POJOに(インターフェイス)を挿入するだけで、を提供するのではなくWriter、モックバージョン(または)を選択できます。次に、を新しいオブジェクト(たとえば)に抽出し、それを個別にテストできます。StringWriterFileWritercomplexLogicToBuildFileName()FileNameBuilder

于 2013-02-13T17:20:44.350 に答える