gpt4 book ai didi

java - 如何注入(inject)java.io.File然后设置其名称

转载 作者:行者123 更新时间:2023-12-02 07:16:41 25 4
gpt4 key购买 nike

我有一个有趣的场景,我需要将 File 引用注入(inject)到我的 POJO 中(这样,在我的测试类中,我可以 stub 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) 构造函数,我必须将注入(inject)的 File 实例绑定(bind)到文件名之前 我有机会执行 complexLogicToBuildFileName(),并且不能用简单的 setter 方法覆盖它。关于如何保留 filefileWriter 作为注入(inject)属性(为了可测试性)的任何想法,但仍然让我使用 complexLogicToBuildFileName()给文件命名?提前致谢。

最佳答案

我不明白为什么你要注入(inject)一个File一个FileWriter,并且你的POJO也会派生一个文件名(通过complexLogicToBuildFileName())。

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

关于java - 如何注入(inject)java.io.File然后设置其名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14859080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com