Java中是否有一个友好的文件管理库?

时间:2018-08-28 14:35:05

标签: java dependency-injection filesystems

我曾经使用this library处理文件,但是现在我想编写简单的单元测试。

问题:Files类是static final,方法是静态的,因此-是不可模拟的。 对我来说,这很令人沮丧,因为当我需要做的实际上只是模拟方法时,我现在需要实际测试文件系统并实际测试结果。当您需要实际使用环境时,并不是真正的单元测试。

现在的代码示例代码:

public class MyClass
{
    public void myMethod(File myFile) throws IOException
    {
        Files.move(myFile.toPath(), myFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
}

我希望代码像这样:

public class MyClass
{
    private final Files files;

    public MyClass(Files files)
    {
        this.files = files;
    }

    public void myMethod(File myFile) throws IOException
    {
        this.files.move(myFile.toPath(), myFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
}

所以我需要一个与“ Files”相同但可注射的类

2 个答案:

答案 0 :(得分:1)

底层的java.nio.Filesystem允许通过实现自定义java.nio.FilesystemProvider

来使用备用文件系统

Google的JimFS是InMemory文件系统的这种实现,只要您远离java.io.File类(不支持),就可以很好地用于测试目的

另一种选择是使用在本地文件系统上运行的测试工具,例如JUnit 4s TemporaryFolder规则

@Rule
public TemporaryFolder temp = new TemporaryFolder()

您可以在此文件夹中创建文件,测试移动操作。该规则确保测试完成后关闭文件夹。

答案 1 :(得分:0)

添加了我的意思的一个小实现。现在可以轻松注入。 https://github.com/drakonli/jcomponents/tree/master/src/main/java/drakonli/jcomponents/file/manager

package drakonli.jcomponents.file.manager;

import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileAttribute;

public class NioFileManager implements IFileManager
{
    @Override
    public Path move(Path source, Path target, CopyOption... options) throws IOException
    {
        return Files.move(source, target, options);
    }

    @Override
    public Path copy(Path source, Path target, CopyOption... options) throws IOException
    {
        return Files.copy(source, target, options);
    }

    @Override
    public boolean isSameFile(Path path, Path path2) throws IOException
    {
        return Files.isSameFile(path, path2);
    }

    @Override
    public Path createTempFile(String prefix, String suffix, FileAttribute<?>... attrs) throws IOException
    {
        return Files.createTempFile(prefix, suffix, attrs);
    }
}