那么正确的写入目标目录的方法是什么?很可能是目标目录内的一个子目录吗?
如果我简单地指定文件为
target/
,它会将文件写入父项目的目标目录,而不是项目的目标目录。
更新:实际上,我希望在测试完成后得到该文件。该文件是为第三方提供的提取格式,需要发送给第三方。测试可以开关,以便只有在文件格式更改需要重新批准时才运行。文件去向并不是一个很大的问题,但我希望能够轻松找到它。target/
,它会将文件写入父项目的目标目录,而不是项目的目标目录。
更新:实际上,我希望在测试完成后得到该文件。该文件是为第三方提供的提取格式,需要发送给第三方。测试可以开关,以便只有在文件格式更改需要重新批准时才运行。文件去向并不是一个很大的问题,但我希望能够轻松找到它。你可以尝试使用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>
你可以将工作目录更改为任何测试所需的目录,例如${project.build.directory}/my_special_dir/
。
surefire插件中的工作目录仅影响正在运行的测试,仅适用于由maven进行的测试。如果你在IDE中运行测试,则工作目录将是其他内容。
无需重复发明轮子...
JDK提供了创建临时文件的方法,并且提供了一种在退出时自动删除它的方式:
File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();
使用该文件,在测试结束时它会自动删除。就是这么简单。
要指定用于临时文件的目录,请使用重载的方法:
File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
/var/folders/xf/scvh7yr11m1glr4b663n1hcsnv5lf0/T/test2614442099335581603.xml
。 - Brett Ryan自 JUnit 5 起,您可以使用 @TempDir。它将在测试之后被删除(包括其内容)。
或者为每个测试使用一个临时目录:
@Test
void testWithTempFiles(@TempDir Path tempDir)
Path file = tempDir.resolve("temp_file.txt");
...
}
或者一个用于类中所有测试的单一测试:
@TempDir
static Path tempDir
@Test
void testWithTempFiles()
Path file = tempDir.resolve("temp_file.txt");
...
}
System.getProperty("basedir")
访问测试项目的基本目录。获取它并在basedir/target下创建文件。<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")
在你的测试中获取实际的输出目录。
临时文件应该被创建到临时目录中。使用调用System.getProperty("java.io.tmpdir")
来检索它。
临时文件应该是临时的,即在不需要时应该被删除。为了实现这一点,在finally
块或在测试后运行的代码中不要忘记删除它,即:
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)
,这样您就可以使用由createTempFile()
生成的特殊名称的文件。
请使用file.deleteOnExit()
。这将创建一个钩子,在JVM终止时自动删除文件。如果使用kill -9
杀死JVM,它将保留文件,因此没有机会运行关闭代码。
在字段上使用JUnit 5的@TempDir
:
@TempDir(cleanup = ON_SUCCESS)
lateinit var tempDirectory: Path
@Test fun example() {
// 使用tempDirectory
}
在测试函数参数上使用JUnit 5的@TempDir
:
@Test fun example(
@TempDir(cleanup = CleanupMode.ON_SUCCESS) tempDirectory: Path
) {
// 使用tempDirectory
}
手动创建文件并调用deleteOnExit()
:
@Test fun example() {
val file = File("file.txt").apply { deleteOnExit() }
}
在测试类或测试函数中使用Kotlin的createTempDirectory
和createTempFile
函数:
val file = createTempFile("file.txt")