76

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

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

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

更新:我实际上想要测试完成后的文件。该文件用于需要发送给第三方的第三方提取格式。可以打开/关闭测试,以便我仅在文件格式更改以重新批准时运行。文件的去向不是什么大问题,但我想要一些容易找到的东西。

4

6 回答 6

81

您可以尝试使用此处描述的TemporaryFolder JUnit @Rule

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

当测试方法完成时,JUnit 会自动删除 TemporaryFolder 中的所有文件和目录,包括 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 中运行测试,则工作目录将是其他目录。

于 2012-09-13T06:28:31.067 回答
55

无需重新发明轮子...

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

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

使用该文件,它会在您的测试完成时自动删除。这里的所有都是它的。

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

File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
于 2012-09-13T06:28:16.187 回答
2

我会编写一个例程来确定文件应该写入的位置,然后我会对其进行统一测试,通常我会尽量避免(尽可能)访问单元测试中的持久数据,例如文件 IO 或数据库访问,这也有性能原因和其他原因.

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

于 2012-09-13T06:06:22.140 回答
2

您将希望能够从 IDE 和 Maven 运行您的测试,因此最佳实践是编写您的测试,这样它们就不会假定它们是在 Maven 中运行的。

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

于 2012-09-13T06:28:36.997 回答
2

事先声明,我强烈反对在单元测试中做这样的事情。我还没有真正尝试过,但它应该可以工作:

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

一种更“合适”的方式(因为我们可能有机会将输出目录配置为其他内容,您可以将surefire插件配置更改为如下内容:

<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")然后你可以在你的测试中得到实际的输出目录。

于 2012-09-13T09:39:02.297 回答
1

临时文件应创建到临时目录中。使用调用检索它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,因此它没有机会运行关闭代码。

于 2012-09-13T06:20:31.520 回答