在使用Maven进行单元测试期间写入临时文件的正确方法是什么?

Bre*_*yan 59 java junit4 maven

我编写了一个单元测试,将文件写入文件系统,没有路径写入工作目录; 因此,如果从项目目录执行,则它在项目根目录中写入,如果在项目父目录中,则写入父目录根目录.

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

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

更新:测试结束后我确实想要文件.该文件用于需要发送给第三方的第三方提取格式.可以打开/关闭测试以允许我仅在文件格式更改以便重新批准时才运行.这个文件不是一个大问题,但我想要一些容易找到的东西.

mab*_*aba 70

你可以尝试使用TemporaryFolder JUnit的@rule描述这里

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

当测试方法完成时,JUnit会自动删除TemporaryFolder中的所有文件和目录.无论测试通过还是失败,JUnit都保证删除资源.


问题更新后

您可以更改使用的工作目录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>
Run Code Online (Sandbox Code Playgroud)

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

surefire插件中的工作目录仅影响正在运行的测试,仅适用于由maven执行的测试.如果从IDE中运行测试,则工作目录将是其他内容.


Boh*_*ian 41

无需重新发明轮子......

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

File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();
Run Code Online (Sandbox Code Playgroud)

使用该文件,测试完成后将自动删除该文件.这里的所有都是它的.

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

File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
Run Code Online (Sandbox Code Playgroud)

  • @BrettRyan没问题 - 您可以指定用于临时文件的目录 - 请参阅已编辑的答案 (3认同)

dpe*_*sek 5

从 JUnit 5 开始,您可以使用@TempDir。测试结束后它将被删除(包括其内容)。

每个测试使用一个临时目录:

@Test
void testWithTempFiles(@TempDir Path tempDir) 
    Path file = tempDir.resolve("temp_file.txt");
    ...
}

Run Code Online (Sandbox Code Playgroud)

或班级中所有测试的单个测试:

@TempDir
static Path tempDir

@Test
void testWithTempFiles() 
    Path file = tempDir.resolve("temp_file.txt");
    ...
}
Run Code Online (Sandbox Code Playgroud)