Spring JUnit 4 テストアノテーション
次のアノテーションは、SpringRunner、Spring の JUnit 4 ルール、Spring の JUnit 4 サポートクラスと組み合わせて使用される場合にのみサポートされます。
@IfProfileValue
@IfProfileValue
は、アノテーションが付けられたテストクラスまたはテストメソッドが特定のテスト環境で有効になっていることを示します。構成された ProfileValueSource
が、提供された name
に一致する value
を返す場合、テストは有効になります。それ以外の場合、テストは無効になり、事実上無視されます。
@IfProfileValue
は、クラスレベル、メソッドレベル、その両方で適用できます。@IfProfileValue
のクラスレベルの使用は、そのクラスまたはそのサブクラス内のメソッドのメソッドレベルの使用よりも優先されます。具体的には、テストは、クラスレベルとメソッドレベルの両方で有効になっている場合に有効になります。@IfProfileValue
がないと、テストは暗黙的に有効になります。これは、JUnit 4 の @Ignore
アノテーションのセマンティクスに類似していますが、@Ignore
が存在すると常にテストが無効になる点が異なります。
次の例は、@IfProfileValue
アノテーションを持つテストを示しています。
Java
Kotlin
@IfProfileValue(name="java.vendor", value="Oracle Corporation") (1)
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
// some logic that should run only on Java VMs from Oracle Corporation
}
1 | このテストは、Java ベンダーが "Oracle Corporation" の場合にのみ実行してください。 |
@IfProfileValue(name="java.vendor", value="Oracle Corporation") (1)
@Test
fun testProcessWhichRunsOnlyOnOracleJvm() {
// some logic that should run only on Java VMs from Oracle Corporation
}
1 | このテストは、Java ベンダーが "Oracle Corporation" の場合にのみ実行してください。 |
または、@IfProfileValue
を values
のリスト(OR
セマンティクスを使用)で構成して、JUnit 4 環境のテストグループに対する TestNG のようなサポートを実現できます。次の例を考えてみましょう。
Java
Kotlin
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) (1)
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// some logic that should run only for unit and integration test groups
}
1 | 単体テストと統合テストに対してこのテストを実行します。 |
@IfProfileValue(name="test-groups", values=["unit-tests", "integration-tests"]) (1)
@Test
fun testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// some logic that should run only for unit and integration test groups
}
1 | 単体テストと統合テストに対してこのテストを実行します。 |
@ProfileValueSourceConfiguration
@ProfileValueSourceConfiguration
は、テストクラスに適用して、@IfProfileValue
アノテーションで構成されたプロファイル値を取得するときに使用する ProfileValueSource
の型を指定できるアノテーションです。テストに対して @ProfileValueSourceConfiguration
が宣言されていない場合は、デフォルトで SystemProfileValueSource
が使用されます。次の例は、@ProfileValueSourceConfiguration
の使用方法を示しています。
Java
Kotlin
@ProfileValueSourceConfiguration(CustomProfileValueSource.class) (1)
public class CustomProfileValueSourceTests {
// class body...
}
1 | カスタムプロファイル値ソースを使用します。 |
@ProfileValueSourceConfiguration(CustomProfileValueSource::class) (1)
class CustomProfileValueSourceTests {
// class body...
}
1 | カスタムプロファイル値ソースを使用します。 |
@Timed
@Timed
は、アノテーション付きのテストメソッドが指定された期間(ミリ秒単位)で実行を終了する必要があることを示します。テキストの実行時間が指定された期間を超えると、テストは失敗します。
期間には、テストメソッド自体の実行、テストの繰り返し(@Repeat
を参照)、テストフィクスチャの設定または破棄が含まれます。次の例は、その使用メソッドを示しています。
Java
Kotlin
@Timed(millis = 1000) (1)
public void testProcessWithOneSecondTimeout() {
// some logic that should not take longer than 1 second to run
}
1 | テストの期間を 1 秒に設定します。 |
@Timed(millis = 1000) (1)
fun testProcessWithOneSecondTimeout() {
// some logic that should not take longer than 1 second to run
}
1 | テストの期間を 1 秒に設定します。 |
Spring の @Timed
アノテーションのセマンティクスは、JUnit 4 の @Test(timeout=…)
サポートとは異なります。具体的には、JUnit 4 がテスト実行タイムアウトを処理するメソッドにより(つまり、別の Thread
でテストメソッドを実行することにより)、テストに時間がかかりすぎると @Test(timeout=…)
はテストをプリエンプティブに失敗します。一方、Spring の @Timed
は、テストを先制的に失敗させるのではなく、失敗する前にテストの完了を待機します。
@Repeat
@Repeat
は、アノテーション付きテストメソッドを繰り返し実行する必要があることを示します。テストメソッドが実行される回数は、アノテーションで指定されます。
繰り返される実行の範囲には、テストメソッド自体の実行と、テストフィクスチャのセットアップまたは破棄が含まれます。SpringMethodRule
とともに使用する場合、スコープには、TestExecutionListener
実装によるテストインスタンスの準備が追加で含まれます。次の例は、@Repeat
アノテーションの使用メソッドを示しています。
Java
Kotlin
@Repeat(10) (1)
@Test
public void testProcessRepeatedly() {
// ...
}
1 | このテストを 10 回繰り返します。 |
@Repeat(10) (1)
@Test
fun testProcessRepeatedly() {
// ...
}
1 | このテストを 10 回繰り返します。 |