Closed1
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
![Kanon](https://res.cloudinary.com/zenn/image/fetch/s--kYg3QWwz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/e61d92ebbd.jpeg)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
は、JUnit 5(Jupiter)で使用されるアノテーションで、テストクラスのインスタンス生成に関するライフサイクルを制御します。
意味と効果
TestInstance.Lifecycle.PER_CLASS
デフォルトでは、JUnit 5はテストメソッドごとに新しいインスタンスを生成します。このライフサイクルはTestInstance.Lifecycle.PER_METHOD
と呼ばれます。しかし、@TestInstance(TestInstance.Lifecycle.PER_CLASS)
を使用すると、テストクラス全体で1つのインスタンスのみが生成され、そのインスタンスがすべてのテストメソッドで共有されます。
具体的には、以下の効果があります:
-
インスタンスの再利用:
- テストクラス全体で1つのインスタンスが生成され、そのインスタンスがすべてのテストメソッドで共有されます。これにより、フィールドを使って状態を保持することができます。
-
コンストラクタの呼び出し:
- テストクラスのコンストラクタはクラスのインスタンスが生成されるときに一度だけ呼び出されます。
-
@BeforeAll
と@AfterAll
のインスタンスメソッド化:-
@BeforeAll
および@AfterAll
アノテーションを付けたメソッドは、デフォルトではstatic
でなければなりませんが、PER_CLASS
ライフサイクルを使用することで、インスタンスメソッドとして定義できます。
-
使用例
以下に具体的な例を示します:
import org.junit.jupiter.api.*
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTests {
private var count = 0
@BeforeAll
fun setupAll() {
println("Before all tests")
}
@BeforeEach
fun setup() {
count++
println("Before each test: count = $count")
}
@Test
fun test1() {
println("Test 1: count = $count")
assertEquals(1, count)
}
@Test
fun test2() {
println("Test 2: count = $count")
assertEquals(2, count)
}
@AfterAll
fun tearDownAll() {
println("After all tests")
}
}
出力結果の解説
この例では、PER_CLASS
ライフサイクルが設定されているため、テストクラスMyTests
のインスタンスは1回だけ生成され、すべてのテストメソッドで共有されます。
-
@BeforeAll
メソッドが最初に一度だけ呼び出されます。 -
@BeforeEach
メソッドは各テストメソッドの前に呼び出され、count
フィールドをインクリメントします。 - 各テストメソッドでは、共有された
count
フィールドの値を確認します。 -
@AfterAll
メソッドが最後に一度だけ呼び出されます。
出力結果は以下のようになります:
Before all tests
Before each test: count = 1
Test 1: count = 1
Before each test: count = 2
Test 2: count = 2
After all tests
まとめ
-
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
を使用すると、テストクラス全体で1つのインスタンスのみが生成され、各テストメソッドで共有されます。 - これにより、インスタンスフィールドを使って状態を保持したり、
@BeforeAll
および@AfterAll
メソッドをインスタンスメソッドとして定義することができます。 - このライフサイクルを使用することで、テストコードがより簡潔になり、特定のシナリオ(例えば、状態を共有する必要があるテスト)に対して便利です。
このスクラップは27日前にクローズされました