我曾经使用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”相同但可注射的类
答案 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);
}
}