在使用Maven进行unit testing期间写入临时文件的正确方法是什么?

我写了一个unit testing,写一个文件到文件系统,没有path写入工作目录; 所以如果从项目目录执行,它将写入项目根目录,如果在项目父目录中写入父目录根目录。

那么写入目标目录的正确方法是什么? 很可能是目标目录内的目录?

如果我相当简单地指定target/文件,它将写入父项目目标而不是项目目标。

更新 :我真的想在testing完成后的文件。 该文件是针对需要发送给第三方的第三方的提取格式。 可以打开/closurestesting,以便只有在文件格式更改为重新审批时才能运行。 文件的位置不是一个很大的问题,但是我想要一些容易find的东西。

您可以尝试使用这里所述的TemporaryFolder JUnit @Rule

TemporaryFolder在由系统属性java.io.tmpdir指定的默认临时文件目录中创build一个文件夹。 newFile方法在临时目录中创build一个新文件,newFolder创build一个新文件夹。

当testing方法结束时,JUnit会自动删除TemporaryFolder中的所有文件和目录。 JUnit保证删除资源,无论testing通过还是失败。


问题更新后

你可以改变maven-surefire-plugin使用的工作目录。

 <plugins> [...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.3</version> <configuration> <workingDirectory>${project.build.directory}</workingDirectory> </configuration> </plugin> [...] </plugins> 

您可以将该工作目录更改为您的testing所需的任何内容,例如${project.build.directory}/my_special_dir/

surefire插件中的工作目录只影响正在运行的testing,仅用于maven进行的testing。 如果您在IDE中运行testing,则工作目录将是其他内容。

没有必要重新发明轮子…

JDK提供了一种创build临时文件的方法,以及一种在退出时自动删除它的方法:

 File file = File.createTempFile( "some-prefix", "some-ext"); file.deleteOnExit(); 

使用该文件,当您的testing结束时,它将被自动删除。 这里的所有都是它的。

要指定要用于临时文件的目录,请使用重载的方法:

 File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path")); 

我会写一个例程,它决定了文件应该写在哪里,然后统一起来,总的来说,我试图避免(尽可能)访问unit testing中的持久数据,比如文件IO或者数据库访问,这有性能方面的原因。 。

看看这个asnwer: https ://stackoverflow.com/a/8032504/395659

您将希望能够从IDE和Maven运行testing,所以最好的做法是编写testing,以免它们在Maven中运行。

处理临时文件的最好方法之一就是使用junit规则 。 这可以让你依靠规则为你清理。

临时文件应该被创build到临时目录中。 使用调用System.getProperty("java.io.tmpdir")检索它

临时文件应该是临时的,即不需要时应该删除。 为了达到这个目的,不要忘了在finally块或者在testing之后运行的代码中删除它,即:

 File tmpFile = ... try { // deal with tempFile } finally { tempFile.delete(); } 

和/或

 public class MyTestCase { private File tmpFile = null; @Before public void setUp() { tmpFile = ...; } @Test public void setUp() { // deal with tmpFile } @After public void setUp() { tmpFile.delete(); } } 

如果可能的话File.createTempFile(String prefix, String suffix)使用File.createTempFile(String prefix, String suffix) ,即可以使用具有createTempFile()生成的特殊名称的文件。

使用file.deleteOnExit() 。 这会创build一个钩子,在JVM终止时自动移除文件。 该文件将保持只有JVM kill -9 ,所以它没有机会运行关机代码。

为了事先说明,我强烈反对在unit testing中做这样的事情。 我没有真的尝试过,但它应该工作:

假设您使用的是surefire插件,从引用的文档中您可以通过System.getProperty("basedir")访问被测项目的基本目录。 获取它并在basedir / target下创build文件。

一个更“合适的”方法(因为我们可能有机会将输出目录configuration到别的东西上,你可以把surefire插件configuration改成这样:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.6</version> <configuration> <systemPropertyVariables> <myOutDir>${project.build.outputDirectory}</myOutDir> </systemPropertyVariables> </configuration> </plugin> 

然后你可以通过System.getProperty("myOutDir")在你的testing中得到实际的输出目录。