Java Junit单元测试中保存文件的路径

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

在Java应用程序中,我有一个类的方法,它只使用文件名保存文件

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();
}