web-dev-qa-db-ja.com

Mavenを使用した単体テスト中に一時ファイルに書き込む正しい方法は何ですか?

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

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

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

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

53
Brett Ryan

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

64
maba

車輪を再発明する必要はありません...

JDKは、一時ファイルを作成する方法と、終了時に自動的に削除する方法を提供します。

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

ファイルを使用すると、テストが終了すると自動的に削除されます。これですべてです。

一時ファイルに使用するディレクトリを指定するには、オーバーロードメソッドを使用します。

File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
38
Bohemian

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

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

2
CloudyMarble

IDEとMavenの両方からテストを実行できるようにする必要があるため、ベストプラクティスは、テストがMaven内で実行されていると想定しないようにテストを記述することです。

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

2

一時ファイルは一時ディレクトリに作成する必要があります。 call 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_で強制終了された場合にのみ残るため、シャットダウンコードを実行する機会はありませんでした。

1
AlexR

事前にそれを述べるために、私はユニットテストでそのようなことをすることに強く反対しています。私は実際にこれを試していませんが、うまくいくはずです:

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")によって実際の出力ディレクトリを取得できます。

1
Adrian Shum