Spring JUnit 4 テストアノテーション

次のアノテーションは、SpringRunnerSpring の 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 回繰り返します。