我已经写一个单元测试,写入文件到文件系统,没有给出路径写入到工作目录; 因此,如果从项目目录执行写入在项目的根,如果在项目父目录写入到父母的根目录。
那么,什么是写到目标目录中的正确方法是什么? 很可能是目标目录内的目录?
如果我很简单,指定target/
与文件将会写入父项目的目标,而不是项目的目标。
更新 :其实我想要的文件的测试结束后。 该文件是为第三方提取格式需要发送给第三方。 该测试可以开/关切换,让我只运行如果重新申请批准文件修改的格式。 这不是在文件进入一个巨大的问题,但我想的东西,很容易找到。
Answer 1:
你可以尝试使用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/
。
在神火插件的工作目录只影响测试正在运行,并只对被行家所进行的测试。 如果您从IDE中运行测试的工作目录将是别的东西。
Answer 2:
没有必要推倒重来......
JDK提供了一种方法来创建一个临时文件和方法来自动删除它退出:
File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();
使用文件,当您的测试完成后会被自动删除。 这里的所有都是它的。
要指定用于临时文件的目录,使用重载的方法:
File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
Answer 3:
我会写一个程序确定,该文件应被写入,这是我UNITEST之后,一般我会尽量避免(尽可能)在单元测试访问持久性数据,如文件IO或数据库访问,这有性能方面的考虑和其他人太多。
看看这个asnwer: https://stackoverflow.com/a/8032504/395659
Answer 4:
你会希望能够既从IDE以及来自Maven的运行你的测试,所以最好的做法是写你的测试,让他们不要以为他们是被内Maven的运行。
其中一个处理临时文件的最好方法是使用JUnit的规则 。 这可以让你依靠规则来清理你。
Answer 5:
临时文件应该被创建到临时目录。 使用电话检索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终止自动删除文件。 该文件将只停留如果JVM与被杀kill -9
,所以它没有机会运行关闭代码。
Answer 6:
事先声明,我是强烈反对在单元测试中做这样的事情。 我还没有真正尝试过这一点,但它应该工作:
假设你正在使用万无一失插件,从中引用,您可以通过以下测试访问项目的基本目录的文件System.getProperty("basedir")
得到它,创造条件,BASEDIR /目标文件。
一个更“合适”的方式(因为我们可能有我们配置的输出目录到别的机会,你可以万无一失插件配置改变是这样的:
<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")
在您的测试。
文章来源: What is the correct way to write to temp file during unit tests with Maven?