76

作業ディレクトリに書き込むパスがない場合に、ファイル システムにファイルを書き込む単体テストを作成しました。したがって、プロジェクト ディレクトリから実行された場合はプロジェクト ルートに書き込まれ、プロジェクトの親ディレクトリにある場合は親ルート ディレクトリに書き込まれます。

では、ターゲットディレクトリに書き込む正しい方法は何ですか? おそらくターゲットディレクトリ内のディレクトリですか?

ファイルで単純に指定するtarget/と、プロジェクト ターゲットではなく、親プロジェクト ターゲットに書き込まれます。

更新: テストが終了した後、実際にファイルが必要です。このファイルは、サード パーティに送信する必要があるサード パーティ用の抽出形式用です。テストのオン/オフを切り替えて、再承認のためにファイルの形式が変更された場合にのみ実行できるようにすることができます。ファイルがどこにあるかは大きな問題ではありませんが、見つけやすいものが欲しいです。

4

6 に答える 6

81

こちらで説明されているように、 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 内からテストを実行する場合、作業ディレクトリは別のものになります。

于 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

IDE と Maven の両方からテストを実行できるようにする必要があるため、Maven 内で実行されていると想定しないようにテストを作成することをお勧めします。

一時ファイルを処理する最良の方法の 1 つは、junit ルールを使用することです。これにより、ルールに依存してクリーンアップすることができます。

于 2012-09-13T06:28:36.997 に答える
2

前もって言っておきますが、私は単体テストでそのようなことをすることに強く反対しています。私はこれを実際に試したことはありませんが、うまくいくはずです:

あなたが確実なプラグインを使用していると仮定すると、それが引用したドキュメントから、テスト中のプロジェクトのベースディレクトリに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")ます。

于 2012-09-13T09:39:02.297 に答える
2

ファイルの書き込み先を決定するルーチンを作成し、後で結合します。一般に、ファイルIOやデータベースアクセスなど、単体テストで永続データにアクセスすることを(可能な限り)回避しようとします。これにはパフォーマンス上の理由などもあります.

この答えを見てください:https://stackoverflow.com/a/8032504/395659

于 2012-09-13T06:06:22.140 に答える
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 に答える