如何注入java.io.File,然后设置其名称



我有一个有趣的场景,我需要将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)构造函数,在我有机会执行complexLogicToBuildFileName()之前,我必须将注入的File实例绑定到文件名,而这不能用简单的setter方法覆盖。关于如何将filefileWriter保留为注入属性(出于可测试性的考虑),但仍然让我使用complexLogicToBuildFileName()来命名文件,有什么想法吗?提前谢谢。

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

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

相关内容

  • 没有找到相关文章

最新更新