如何插入java.io.File并设置其名称

如何插入java.io.File并设置其名称,java,file,unit-testing,dependency-injection,mockito,Java,File,Unit Testing,Dependency Injection,Mockito,我有一个有趣的场景,我需要将一个文件引用注入我的POJO(这样,在我的测试类中,我可以存根文件,而不实际将任何内容写入磁盘),但直到运行时,才真正知道文件名: public class MyPOJO { private File file; private FileWriter writer; // Getter and setter for file & writer public void writeToDisk(String message)

我有一个有趣的场景,我需要将一个
文件
引用注入我的POJO(这样,在我的测试类中,我可以存根
文件
,而不实际将任何内容写入磁盘),但直到运行时,才真正知道文件名:

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.");
    }
}

问题是,由于强制的
文件(字符串)
构造函数,我必须先将注入的
文件
实例绑定到文件名,然后才能执行
complexLogicToBuildFileName()
,而这不能用简单的setter方法覆盖。关于如何将
文件
文件编写器
保留为注入属性(出于可测试性的考虑),但仍然让我使用
complexLogicToBuildFileName()
来命名文件,有什么想法吗?提前谢谢。

我不明白您为什么要注入
文件和
文件编写器,而您的POJO也会派生一个文件名(通过
complexLogicToBuildFileName()

如果您想抽象出编写过程,为什么不简单地在POJO中插入一个
编写器
(接口),您可以选择一个模拟版本(甚至是
StringWriter
),而不是提供一个
文件编写器
。然后,您可以将
complexLogicToBuildFileName()
提取到一个新对象中(比如,
FileNameBuilder
)并单独测试它