gpt4 book ai didi

java - 如何使用 Mockito 模拟文件静态方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:55 25 4
gpt4 key购买 nike

我的实用程序中有一个方法:

public void createDirectories(final Path root, final Scaffolding scaffolding) throws FileAlreadyExistsException {
if (Files.exists(root)) {
throw new FileAlreadyExistsException("Root directory " + root.toString() + " already exists.");
} else {
Files.createDirectories(root);
// Create directories from the scaffolding object
}
}

我想模拟 Files,这样我就可以测试以确保 Files.createDirectories 是否调用了预期的字段。

我可以用 Mockito 做到这一点吗?或者我是否需要实际创建目录并检查它们是否存在于某个 tmp 文件夹中?

最佳答案

当您使用 tdd 编写一些东西并遇到问题时,请将其视为糟糕设计的信号。您不需要模拟静态字段或找到一些棘手的库来完成它。与其这样做,不如创建代表文件系统的实体,并将与文件操作相关的所有方法都放在此类中。通过此重构,您的代码将如下所示:

class UtilClass { //util classes are bad don't do it
private final FileSystem fileSystem;

public UtilClass(FileSystem fileSystem) {
this.fileSystem = fileSystem;
}


public void createDirectories(final Path root, final Scaffolding scaffolding) throws FileAlreadyExistsException {
if (fileSystem.exists(root)) {
throw new FileAlreadyExistsException("Root directory " + root.toString() + " already exists.");
} else {
fileSystem.createDirectories(root);
// Create directories from the scaffolding object
}




interface FileSystem {

boolean exists(Path path);

void createDirectories(Path path);
}

和测试类

class UtilClassTest {


@Test(expected = FileAlreadyExistsException.class)
public void shouldThrowExceptionWhenRootPathExists() {
FileSystem mockFileSystem = Mockito.mock(FileSystem.class);
Mockito.when(mockFileSystem.exists(anyPath())).return(true);
UtilClass util = new UtilClass(mockFileSystem);
util.createDirectories(mock(Path.class), mock(Scaffolding.class))
}
}

在您的外部测试代码中,将模拟替换为实现。

class FileSystemImpl implements FileSystem {

boolean exists(Path path){
return Files.exists(path);
}

createDirectories(Path path){
return Files.createDirectories(path);
}

}

而且您不需要在测试或模拟静态字段中接触文件系统。

关于java - 如何使用 Mockito 模拟文件静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44832778/

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