Java Junit单元测试中保存文件的路径
在Java应用程序中,我有一个类的方法,它只使用文件名保存文件Java Junit单元测试中保存文件的路径,java,file,unit-testing,junit,Java,File,Unit Testing,Junit,在Java应用程序中,我有一个类的方法,它只使用文件名保存文件 public void doSomething(){ final File file = new File("XXX"+(new Random().next())+".txt"); file.createNewFile(); } 然后,在使用JUnit4进行的单元测试中,我运行了执行该方法的类,并在项目的根文件夹中看到了一个名为XXX.txt的文件 @Test public void doSomethingTest
public void doSomething(){
final File file = new File("XXX"+(new Random().next())+".txt");
file.createNewFile();
}
然后,在使用JUnit4进行的单元测试中,我运行了执行该方法的类,并在项目的根文件夹中看到了一个名为XXX.txt
的文件
@Test
public void doSomethingTest() throws Exception{
//call doSomething();
Path path = //to project folder
Files.delete(path);
}
如何动态获取此路径,以便使用
@After
方法删除它?您可以使用获取完整的文件路径,将其作为方法公开,然后在junit测试中删除它。您可以使用Apache的commons io。它有一个FileUtils类,可以执行您想要的操作
下面是一个示例、实现及其测试
`
`
测试文件
`
`
方法FileUtils.deletequity在删除时将返回true,否则返回false。我建议更改源代码并从外部传递父文件夹,最好是在类构造函数中 如果由于某种原因无法执行此操作,则可以尝试覆盖控制当前工作目录的系统属性,默认情况下,将在该目录中创建文件 请注意,
user.dir
是全局的,因此更改它将影响所有类。例如,您将无法同时运行测试
同样在JUnit中,您可以使用规则,该规则将在测试开始之前创建一个临时目录,并在测试完成后删除它
示例(从javadoc复制粘贴):
最简单的方法是允许代码插入创建文件的基本目录,从而使代码可测试 而不是
public Foo() {
}
public void doSomething() {
final File file = new File("XXX" + (new Random().next()) + ".txt");
file.createNewFile();
}
使用
现在,您的测试可以创建一个临时空目录,将其传递给构造函数,调用该方法,检查文件并在测试后删除它们
这可能是您无论如何都想要的功能,因为总是在当前目录中写入对我来说似乎不是一个好主意。只是调用
新文件('XXX.txt')。delete()
在测试中不起作用?我说我在类中有一个方法,而不是在带注释的方法中@Test@mat_boy不清楚你在问什么。文件是否从测试类创建与此无关。如果它名为XXX.txt,您可以从测试中执行新文件(“XXX.txt”).delete(),它将被删除。我猜问题在于您不知道文件名,因为它是在测试方法中动态生成的。如果是这样,请在问题中明确说明。发布真实代码而不是伪代码。所以我们知道它是如何动态生成的。名称是使用UUID创建的。所以我事先不知道。因此,是的,我将更新查询。始终可以选择不完全接触文件系统。根据您要测试的内容,将文件操作包装到单独的类中并模拟它可能会很有用!我不返回methodOk,甚至更好:将文件变量设为类变量(而不是方法变量),然后使用file.delete()在@After方法中删除它。别忘了在@After中检查null。ie:if(file!=null)file.delete();这似乎不是一个干净的解决方案。我不需要把它作为类变量。我将创建多个文件,名称很可能存储在数据库中。如果,正如你在问题中所说,你需要在@After方法中删除文件,然后你需要一个类变量。如果要在方法中创建多个文件,请在创建文件时使用ArrayList并将文件添加到此列表,然后在@After方法中删除。您还可以使用ArrayList,在其中存储文件路径,而不是ArrayList。但两者都需要是类级变量。我只需要获取项目根的路径,即文件自动保存到感兴趣的位置,但文件夹是在我测试的方法中定义的。我无法将临时文件夹传递给该方法。正如前面所建议的那样,我建议更改源代码并从外部传递父文件夹(最好是在类构造函数中)。但该文件的名称在该方法外部不可用。在您的示例中,将文件名作为参数是一个好主意。这样它就会紧密耦合。并且可以重复使用以创建任何类型的文件名
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();
}
}
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");
// ...
}
}
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();
}