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

以下のアノテーションは、SpringExtension および JUnit Jupiter(つまり、JUnit 5 のプログラミングモデル)と組み合わせて使用するとサポートされます。

@SpringJUnitConfig

@SpringJUnitConfig は、JUnit Jupiter の @ExtendWith(SpringExtension.class) と Spring TestContext フレームワークの @ContextConfiguration を組み合わせた合成アノテーションです。クラスレベルで @ContextConfiguration のドロップイン置換として使用できます。構成オプションに関して、@ContextConfiguration と @SpringJUnitConfig の唯一の違いは、@SpringJUnitConfig の value 属性でコンポーネントクラスを宣言できることです。

次の例は、@SpringJUnitConfig アノテーションを使用して構成クラスを指定する方法を示しています。

  • Java

  • Kotlin

@SpringJUnitConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterSpringTests {
	// class body...
}
1 構成クラスを指定します。
@SpringJUnitConfig(TestConfig::class) (1)
class ConfigurationClassJUnitJupiterSpringTests {
	// class body...
}
1 構成クラスを指定します。

次の例は、@SpringJUnitConfig アノテーションを使用して構成ファイルの場所を指定する方法を示しています。

  • Java

  • Kotlin

@SpringJUnitConfig(locations = "/test-config.xml") (1)
class XmlJUnitJupiterSpringTests {
	// class body...
}
1 構成ファイルの場所を指定します。
@SpringJUnitConfig(locations = ["/test-config.xml"]) (1)
class XmlJUnitJupiterSpringTests {
	// class body...
}
1 構成ファイルの場所を指定します。

詳細については、コンテキスト管理および @SpringJUnitConfig (Javadoc) および @ContextConfiguration の javadoc を参照してください。

@SpringJUnitWebConfig

@SpringJUnitWebConfig は、JUnit Jupiter の @ExtendWith(SpringExtension.class) と Spring TestContext フレームワークの @ContextConfiguration および @WebAppConfiguration を組み合わせた合成アノテーションです。クラスレベルで、@ContextConfiguration および @WebAppConfiguration のドロップイン置換として使用できます。構成オプションに関して、@ContextConfiguration と @SpringJUnitWebConfig の唯一の違いは、@SpringJUnitWebConfig の value 属性を使用してコンポーネントクラスを宣言できることです。さらに、@SpringJUnitWebConfig で resourcePath 属性を使用することによってのみ、@WebAppConfiguration から value 属性をオーバーライドできます。

次の例は、@SpringJUnitWebConfig アノテーションを使用して構成クラスを指定する方法を示しています。

  • Java

  • Kotlin

@SpringJUnitWebConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterSpringWebTests {
	// class body...
}
1 構成クラスを指定します。
@SpringJUnitWebConfig(TestConfig::class) (1)
class ConfigurationClassJUnitJupiterSpringWebTests {
	// class body...
}
1 構成クラスを指定します。

次の例は、@SpringJUnitWebConfig アノテーションを使用して構成ファイルの場所を指定する方法を示しています。

  • Java

  • Kotlin

@SpringJUnitWebConfig(locations = "/test-config.xml") (1)
class XmlJUnitJupiterSpringWebTests {
	// class body...
}
1 構成ファイルの場所を指定します。
@SpringJUnitWebConfig(locations = ["/test-config.xml"]) (1)
class XmlJUnitJupiterSpringWebTests {
	// class body...
}
1 構成ファイルの場所を指定します。

詳細については、コンテキスト管理、および @SpringJUnitWebConfig (Javadoc) @ContextConfiguration (Javadoc) @WebAppConfiguration (Javadoc) の javadoc を参照してください。

@TestConstructor

@TestConstructor は、テストのクラスコンストラクターのパラメーターをテストの ApplicationContext のコンポーネントからオートワイヤーする方法を構成するために使用される型レベルのアノテーションです。

@TestConstructor が存在しないか、テストクラスにメタに存在する場合は、デフォルトのテストコンストラクターのオートワイヤモードが使用されます。デフォルトモードを変更する方法の詳細については、以下のヒントを参照してください。ただし、コンストラクターでの @Autowired@jakarta.inject.Inject、または @javax.inject.Inject のローカル宣言は、@TestConstructor およびデフォルトモードの両方より優先されることに注意してください。

デフォルトのテストコンストラクターオートワイヤーモードの変更

デフォルトのテストコンストラクターのオートワイヤーモードは、spring.test.constructor.autowire.mode JVM システムプロパティを all に設定することで変更できます。または、SpringProperties メカニズムを介してデフォルトモードを設定することもできます。

Spring Framework 5.3 以降、デフォルトモードは JUnit プラットフォーム構成パラメーター (英語) として設定することもできます。

spring.test.constructor.autowire.mode プロパティが設定されていない場合、テストクラスコンストラクターは自動的にオートワイヤーされません。

Spring Framework 5.2 以降、@TestConstructor は、JUnit Jupiter で使用する SpringExtension との組み合わせでのみサポートされます。多くの場合、SpringExtension は自動的に登録されます。たとえば、@SpringJUnitConfig や @SpringJUnitWebConfig などのアノテーション、Spring Boot テストのさまざまなテスト関連のアノテーションを使用する場合などです。

@NestedTestConfiguration

@NestedTestConfiguration は、内部テストクラスの囲んでいるクラス階層内で Spring Test 構成アノテーションがどのように処理されるかを構成するために使用される型レベルのアノテーションです。

@NestedTestConfiguration がテストクラス、そのスーパー型階層、それを囲むクラス階層に存在またはメタ存在しない場合、デフォルトの外側の構成継承モードが使用されます。デフォルトモードを変更する方法の詳細については、以下のヒントを参照してください。

デフォルトの包含構成継承モードの変更

デフォルトの同封構成継承モードは INHERIT ですが、spring.test.enclosing.configuration JVM システムプロパティを OVERRIDE に設定することで変更できます。または、SpringProperties メカニズムを介してデフォルトモードを設定することもできます。

Spring TestContext フレームワークは、次のアノテーションの @NestedTestConfiguration セマンティクスを尊重します。

@NestedTestConfiguration の使用は、通常、JUnit Jupiter の @Nested テストクラスと組み合わせた場合にのみ意味があります。ただし、Spring をサポートする他のテストフレームワークと、このアノテーションを利用するネストされたテストクラスが存在する場合があります。

例と詳細については、@Nested テストクラスの構成を参照してください。

@EnabledIf

@EnabledIf は、アノテーション付きの JUnit Jupiter テストクラスまたはテストメソッドが有効であり、提供された expression が true に評価される場合に実行する必要があることを通知するために使用されます。具体的には、式が Boolean.TRUE または true に等しい String (大文字小文字を無視)に評価される場合、テストは有効になります。クラスレベルで適用すると、そのクラス内のすべてのテストメソッドもデフォルトで自動的に有効になります。

式は次のいずれかです。

  • Spring 式言語(SpEL)式。例: @EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Spring Environment で使用可能なプロパティのプレースホルダー。例: @EnabledIf("${smoke.tests.enabled}")

  • テキストリテラル。例: @EnabledIf("true")

ただし、@EnabledIf("false") は @Disabled と同等であり、@EnabledIf("true") は論理的に無意味であるため、プロパティプレースホルダーの動的解決の結果ではないテキストリテラルはゼロの実用的な値であることに注意してください。

@EnabledIf をメタアノテーションとして使用して、カスタム合成アノテーションを作成できます。例: 次のように、カスタム @EnabledOnMac アノテーションを作成できます。

  • Java

  • Kotlin

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
	expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
	reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@EnabledIf(
		expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
		reason = "Enabled on Mac OS"
)
annotation class EnabledOnMac {}

@EnabledOnMac は、可能なことの例としてのみ意図されています。その正確な使用例がある場合は、JUnit Jupiter に組み込まれている @EnabledOnOs(MAC) サポートを使用してください。

JUnit 5.7 以降、JUnit Jupiter には @EnabledIf という名前の条件アノテーションもあります。Spring の @EnabledIf サポートを使用する場合は、正しいパッケージからアノテーション型をインポートするようにしてください。

@DisabledIf

@DisabledIf は、アノテーション付きの JUnit Jupiter テストクラスまたはテストメソッドが無効になっていることを通知するために使用され、提供された expression が true と評価される場合は実行されません。具体的には、式が Boolean.TRUE または true に等しい String (大文字と小文字を区別しない)と評価される場合、テストは無効になります。クラスレベルで適用すると、そのクラス内のすべてのテストメソッドも自動的に無効になります。

式は次のいずれかです。

  • Spring 式言語(SpEL)式。例: @DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Spring Environment で使用可能なプロパティのプレースホルダー。例: @DisabledIf("${smoke.tests.disabled}")

  • テキストリテラル。例: @DisabledIf("true")

ただし、@DisabledIf("true") は @Disabled と同等であり、@DisabledIf("false") は論理的に無意味であるため、プロパティプレースホルダーの動的解決の結果ではないテキストリテラルはゼロの実用的な値であることに注意してください。

@DisabledIf をメタアノテーションとして使用して、カスタム合成アノテーションを作成できます。例: 次のように、カスタム @DisabledOnMac アノテーションを作成できます。

  • Java

  • Kotlin

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
	expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
	reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@DisabledIf(
		expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
		reason = "Disabled on Mac OS"
)
annotation class DisabledOnMac {}

@DisabledOnMac は、可能なことの例としてのみ意図されています。その正確な使用例がある場合は、JUnit Jupiter に組み込まれている @DisabledOnOs(MAC) サポートを使用してください。

JUnit 5.7 以降、JUnit Jupiter には @DisabledIf という名前の条件アノテーションもあります。Spring の @DisabledIf サポートを使用する場合は、正しいパッケージからアノテーション型をインポートするようにしてください。