Junit5でTemporaryFolderルールを削除する方法 質問する

Junit5でTemporaryFolderルールを削除する方法 質問する

私はユニットテストをJunit4からJunit5に移行しています。私が使用しているテストではTemporaryFolder ルールJunit4 API から。テストを機能させるために、@EnableRuleMigrationSupportアノテーションを追加しました:

@EnableRuleMigrationSupport
public final class SomeTest {

    @Rule
    public final TemporaryFolder tmp = new TemporaryFolder();

   // tests ...
}

私の理解では、Junit5では拡張機能の代わりにルールTemporaryFolderですが、 Junit5 拡張機能での代替品が見つかりません。 存在するのでしょうか?TemporaryFolderルールを拡張機能に正しく置き換えるにはどうすればよいでしょうか?

ベストアンサー1

あなたは@TempDirアノテーション(JUnit 5.4+)については、JUnit 5 ユーザーガイドの§2.20.1ユーザーガイドより(強調私の):

組み込みTempDirectory拡張機能は、個々のテストまたはテスト クラス内のすべてのテストの一時ディレクトリを作成およびクリーンアップするために使用されます。デフォルトで登録されています。これを使用するには、 または の非プライベート フィールドに をアノテーションするjava.nio.file.Pathか、またはjava.io.Fileでアノテーションされた@TempDirタイプのパラメータをjava.nio.file.Pathライフサイクル メソッドまたはテスト メソッドに追加します。java.io.File@TempDir

注: この拡張機能は バージョン で追加され5.4、現在 ( 時点5.8.2) は実験段階です。

インスタンス フィールドの使用例:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File

class SomeTests {

    @TempDir
    Path directory; // may be private since 5.8

}

@TempDir フィールドをプライベートにできるようにする #2687

テストメソッドのパラメータを使用する例:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File

class SomeTests {

    @Test
    void testFoo(@TempDir Path directory) {
        // do test...
    }

}

注記:コンストラクター パラメーターはサポートされていません。

ディレクトリの作成と削除については、Javadocの@TempDir(JUnit 5.8.2 からのドキュメント引用):

創造

一時ディレクトリは、テスト クラスのフィールドまたはライフサイクル メソッドまたはテスト メソッドのパラメータに の注釈が付けられている場合にのみ作成されます@TempDir。フィールド タイプまたはパラメータ タイプがPathまたは のどちらでもない場合File、または一時ディレクトリを作成できない場合は、必要に応じてExtensionConfigurationExceptionまたは がParameterResolutionExceptionスローされます。また、ParameterResolutionExceptionの注釈が付けられたコンストラクタ パラメータに対して がスローされます@TempDir

範囲

デフォルトでは、@TempDirアノテーションの宣言ごとに個別の一時ディレクトリが作成されます。テスト クラス内のすべてのテストで一時ディレクトリを共有する場合は、フィールドstaticまたはメソッドのパラメーターでアノテーションを宣言する必要があります@BeforeAll

古い行動

junit.jupiter.tempdir.scope構成パラメータを に設定することで、単一の一時ディレクトリを使用する古い動作に戻すことができますper_context。その場合、一時ディレクトリのスコープは、テスト クラスの実行時に最初のアノテーションがどこで検出されたかによって決まります。アノテーションがフィールドまたはメソッドのパラメータ@TempDirに存在する場合、一時ディレクトリはクラス内のすべてのテストで共有されます。それ以外の場合、たとえば がインスタンス フィールドまたはテスト、、またはメソッドのパラメータでのみ使用されている場合、各テストは独自の一時ディレクトリを使用します。static@BeforeAll@TempDir@BeforeEach@AfterEach

削除

一時ディレクトリのスコープの終わりに達すると、つまりテスト メソッドまたはクラスの実行が終了すると、JUnit は一時ディレクトリ内のすべてのファイルとディレクトリを再帰的に削除し、最後に一時ディレクトリ自体を削除します。ファイルまたはディレクトリの削除に失敗した場合は、IOExceptionテストまたはテスト クラスが失敗する原因となるエラーがスローされます。

おすすめ記事