在Java应用程序中,我有一个类的方法,只使用其名称来保存文件。
public void doSomething(){
final File file = new File("XXX"+(new Random().next())+".txt");
file.createNewFile();
}
然后,在使用 JUnit 4 的单元测试中,我运行执行该方法的类,并在项目的根文件夹中看到名称为XXX.txt
的文件。< / p>
@Test
public void doSomethingTest() throws Exception{
//call doSomething();
Path path = //to project folder
Files.delete(path);
}
如何动态获取此路径,以便我可以使用@After
方法将其删除?
答案 0 :(得分:6)
最简单的方法是通过允许代码注入创建文件的基本目录来使代码可测试。
而不是
public Foo() {
}
public void doSomething() {
final File file = new File("XXX" + (new Random().next()) + ".txt");
file.createNewFile();
}
使用
private File baseDirectory;
public Foo() {
this(new File("."));
}
public Foo(File baseDirectory) {
this.baseDirectory = baseDirectory;
}
public void doSomething() {
final File file = new File(baseDirectory, "XXX" + (new Random().next()) + ".txt");
file.createNewFile();
}
现在你的测试可以创建一个临时的空目录,将它传递给构造函数,调用方法,检查文件并在测试后删除它们。
这可能是你想要的功能,因为总是写在当前目录中对我来说似乎不是一个好主意。
答案 1 :(得分:2)
我建议,如已经建议的那样,更改源代码并从外部传递父文件夹,最好是在类构造函数中。
如果由于某种原因你无法做到,那么你可以尝试覆盖控制当前工作目录的user.dir系统属性,默认情况下将创建文件。
请注意user.dir
是全局的,因此更改它会影响所有类。例如,您无法同时运行测试。
同样在JUnit中,您可以使用TemporaryFolder规则,该规则将在测试开始之前创建临时目录,并在测试结束后将其删除。
示例(来自javadoc的复制粘贴):
public static class HasTempFolder {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testUsingTempFolder() throws IOException {
File createdFile = folder.newFile("myfile.txt");
File createdFolder = folder.newFolder("subfolder");
// ...
}
}
答案 2 :(得分:0)
您可以使用file.getAbsolutePath()获取完整的文件路径,将其作为方法公开,然后在junit测试中将其删除。
答案 3 :(得分:0)
你可以使用Apache的commons-io。它有一个FileUtils类,可以做你想要的。
这是一个示例,实现及其测试 `
import java.io.File;
import java.io.IOException;
public class FileSave {
public static void main(String[] args) throws IOException {
FileSave fileSave = new FileSave();
fileSave.saveFile("test.txt");
}
public void saveFile(String fileName) throws IOException {
final File file = new File(fileName);
file.createNewFile();
System.out.println("Hello");
}
}
`
测试文件
`
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.Test;
public class FileSaveTest {
@Test
public void checkFileSaved() throws Exception{
FileSave fileSave = new FileSave();
fileSave.saveFile("test.txt");
Assert.assertTrue(FileUtils.deleteQuietly(new File("test.txt")));
System.out.println();
}
}
`
FileUtils.deleteQuietly 方法在删除时返回true,否则返回false。