0

我有一个有趣的场景,我需要在File我的 POJO 中注入一个引用(这样,在我的测试类中,我可以存根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),我必须将注入File的实例绑定到文件名,而这不能用简单的 setter 方法覆盖。关于如何保存和注入属性的任何想法(为了可测试性),但仍然让我用来命名文件?提前致谢。complexLogicToBuildFileName()filefileWritercomplexLogicToBuildFileName()

4

1 回答 1

2

我不明白您为什么要注入 aFile a FileWriter,并且您的 POJO 也派生了一个文件名(通过complexLogicToBuildFileName())。

如果你想抽象出写作,为什么不简单地用一个Writer(接口)注入你的 POJO,你可以选择一个模拟版本(甚至是一个StringWriter)而不是提供一个FileWriter. 然后,您可以将其提取complexLogicToBuildFileName()到一个新对象(例如FileNameBuilder)中并单独对其进行测试。

于 2013-02-13T17:20:44.350 回答