@TestInstance
アノテーションの簡単な説明と、それがJUnit 5でどのように役立つかを教えてください。
おそらくフィールドをstaticにすることで同じ効果を達成できると思います。
ドキュメント は有用な要約を提供すると思います:
JUnit Jupiterが同じテストインスタンスですべてのテストメソッドを実行することを希望する場合は、テストクラスに@TestInstance(Lifecycle.PER_CLASS)の注釈を付けるだけです。このモードを使用すると、新しいテストインスタンスがテストクラスごとに1回作成されます。したがって、テストメソッドがインスタンス変数に保存された状態に依存している場合、@ BeforeEachまたは@AfterEachメソッドでその状態をリセットする必要があります。
「クラスごと」モードには、デフォルトの「メソッドごと」モードに比べていくつかの追加の利点があります。具体的には、「クラスごと」モードでは、非静的メソッドとインターフェイスのデフォルトメソッドで@BeforeAllと@AfterAllを宣言することが可能になります。したがって、「クラスごと」モードでは、@ Nestedテストクラスで@BeforeAllおよび@AfterAllメソッドを使用することもできます。
しかし、あなたはおそらくすでに読んでおり、フィールドを静的にすることは、フィールドをインスタンス変数として宣言し、@TestInstance(Lifecycle.PER_CLASS)
を使用するのと同じ効果があると考えるのは正しいでしょう。
したがって、「JUnit 5でどのように役立つか」という質問に対する答えは、おそらく@TestInstance
...
@TestInstance
は偶発的である可能性が低いか、コピーアンドペーストの結果です。この注釈は、単体テストの実行時に作成されるオブジェクトの数を減らすために導入されました。
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
をテストクラスに追加すると、クラスのすべてのテストに対してクラスの新しいインスタンスが作成されることを回避できます。これは、同じテストクラスに多くのテストがあり、このクラスのインスタンス化が高価な場合に特に役立ちます。
この注釈は注意して使用する必要があります。すべての単体テストは分離され、互いに独立している必要があります。テストの1つが状態odテストクラスを変更する場合、この機能は使用しないでください。
同じ効果を得るためにフィールドを静的にすることは良い考えではありません。実際に作成されるオブジェクトの数は減りますが、テストクラスのすべてのテストが実行されたときにそれらをクリーンアップすることはできません。これは、巨大なテストスイートがある場合に問題を引き起こす可能性があります。
@TestInstance
は、注釈付きテストクラスまたはテストインターフェイスのテストインスタンスのライフサイクルを構成するために使用されます:
PER_CLASS
:テストクラスごとに1回、新しいテストインスタンスが作成されます。PER_METHOD
:各テストメソッド、テストファクトリメソッド、またはテストテンプレートメソッドごとに新しいテストインスタンスが作成されます。このモードは、JUnitバージョン1〜4で見られる動作に似ています。@TestInstance
がテストクラスまたはテストクラスによって実装されたテストインターフェイスで明示的に宣言されていない場合、ライフサイクルモードは暗黙的にデフォルトの PER_METHOD
になります。 =。
テストインスタンスのライフサイクルモードを PER_CLASS
に設定すると、次の機能が有効になります。
@BeforeAll
メソッドと@AfterAll
メソッド間で共有されるテストインスタンスの状態。@BeforeAll
テストクラスの@AfterAll
および@Nested
メソッドの宣言。@BeforeAll
および@AfterAll
の宣言。@BeforeAll
および@AfterAll
メソッドの簡易宣言。詳細については、 test instance lifecycle documentationをご覧ください。