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 指定組態檔案的位置。

請參閱 Context 管理 以及 @SpringJUnitConfig@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 指定組態檔案的位置。

請參閱 Context 管理 以及 @SpringJUnitWebConfig@ContextConfiguration@WebAppConfiguration 的 javadoc 以取得更多詳細資訊。

@TestConstructor

@TestConstructor 是一個可以套用至測試類別的註解,用於組態如何從測試 ApplicationContext 中的組件自動裝配測試類別建構子的參數。

如果測試類別上不存在或 Meta-present @TestConstructor,將使用預設的測試建構子自動裝配模式。請參閱下方提示,以了解如何變更預設模式的詳細資訊。但是請注意,建構子上 @Autowired@jakarta.inject.Inject@javax.inject.Inject 的本機宣告優先於 @TestConstructor 和預設模式。

變更預設測試建構子自動裝配模式

預設的測試建構子自動裝配模式可以透過將 spring.test.constructor.autowire.mode JVM 系統屬性設定為 all 來變更。或者,預設模式可以透過 SpringProperties 機制設定。

預設模式也可以組態為 JUnit Platform 組態參數

如果未設定 spring.test.constructor.autowire.mode 屬性,則不會自動自動裝配測試類別建構子。

@TestConstructor 僅在與 SpringExtension 結合使用於 JUnit Jupiter 時才受支援。請注意,SpringExtension 通常會自動為您註冊 – 例如,當使用 @SpringJUnitConfig@SpringJUnitWebConfig 等註解或 Spring Boot Test 中的各種測試相關註解時。

@NestedTestConfiguration

@NestedTestConfiguration 是一個可以套用至測試類別的註解,用於組態如何在內部測試類別的封閉類別階層中處理 Spring 測試組態註解。

如果測試類別、其超類型階層或其封閉類別階層中不存在或 Meta-present @NestedTestConfiguration,則將使用預設的封閉組態繼承模式。請參閱下方提示,以了解如何變更預設模式的詳細資訊。

變更預設封閉組態繼承模式

預設的封閉組態繼承模式INHERIT,但可以透過將 spring.test.enclosing.configuration JVM 系統屬性設定為 OVERRIDE 來變更。或者,預設模式可以透過 SpringProperties 機制設定。

Spring TestContext 框架 針對下列註解,遵循 @NestedTestConfiguration 語意。

@NestedTestConfiguration 的使用通常僅在與 JUnit Jupiter 中的 @Nested 測試類別結合使用時才有意義;但是,可能有其他測試框架支援 Spring 和巢狀測試類別,這些框架會使用此註解。

請參閱 @Nested 測試類別組態 以取得範例和更多詳細資訊。

@EnabledIf

@EnabledIf 用於表示如果提供的 expression 評估為 true,則啟用註解的 JUnit Jupiter 測試類別或測試方法,並應執行。具體而言,如果運算式評估為 Boolean.TRUE 或等於 trueString (忽略大小寫),則啟用測試。當在類別層級套用時,預設也會自動啟用該類別中的所有測試方法。

運算式可以是下列任何一種

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

  • Spring Environment 中可用的屬性預留位置。例如:@EnabledIf("${smoke.tests.enabled}")

  • 文字字面值。例如:@EnabledIf("true")

但是請注意,不是屬性預留位置動態解析結果的文字字面值沒有實際價值,因為 @EnabledIf("false") 等同於 @Disabled,而 @EnabledIf("true") 在邏輯上沒有意義。

您可以將 @EnabledIf 用作 Meta-Annotation 來建立自訂組合註解。例如,您可以建立自訂 @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 用於表示如果提供的 expression 評估為 true,則停用註解的 JUnit Jupiter 測試類別或測試方法,且不應執行。具體而言,如果運算式評估為 Boolean.TRUE 或等於 trueString (忽略大小寫),則停用測試。當在類別層級套用時,預設也會自動停用該類別中的所有測試方法。

運算式可以是下列任何一種

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

  • Spring Environment 中可用的屬性預留位置。例如:@DisabledIf("${smoke.tests.disabled}")

  • 文字字面值。例如:@DisabledIf("true")

但是請注意,不是屬性預留位置動態解析結果的文字字面值沒有實際價值,因為 @DisabledIf("true") 等同於 @Disabled,而 @DisabledIf("false") 在邏輯上沒有意義。

您可以將 @DisabledIf 用作 Meta-Annotation 來建立自訂組合註解。例如,您可以建立自訂 @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 支援,請確保從正確的套件匯入註解類型。