什么是在单元测试与Maven写入临时文件的正确方法是什么?(What is the correct

2019-06-28 07:21发布

我已经写一个单元测试,写入文件到文件系统,没有给出路径写入到工作目录; 因此,如果从项目目录执行写入在项目的根,如果在项目父目录写入到父母的根目录。

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

如果我很简单,指定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?