Spring JUnit Jupiter 測試註解

當與 SpringExtension 和 JUnit Jupiter(即 JUnit 中的程式設計模型)結合使用時,支援以下註解。

@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@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@ContextConfiguration@WebAppConfiguration 的 javadoc。

@TestConstructor

@TestConstructor 是一個可以應用於測試類的註解,用於配置測試類建構函式的引數如何從測試的 ApplicationContext 中的元件自動裝配。

如果測試類上不存在或元存在 @TestConstructor,將使用預設的 *測試建構函式自動裝配模式*。有關如何更改預設模式的詳細資訊,請參閱下面的提示。但請注意,建構函式上本地宣告的 @Autowired@jakarta.inject.Inject 優先於 @TestConstructor 和預設模式。

更改預設測試建構函式自動裝配模式

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

預設模式也可以配置為 JUnit 平臺配置引數

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

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

@NestedTestConfiguration

@NestedTestConfiguration 是一個可以應用於測試類的註解,用於配置 Spring 測試配置註解如何在內部測試類的封閉類層次結構中進行處理。

如果測試類、其超型別層次結構或其封閉類層次結構中不存在或元存在 @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 Expression Language (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 用於表示如果提供的 expression 計算結果為 true,則應停用帶註解的 JUnit Jupiter 測試類或測試方法,並且不應執行。具體來說,如果表示式計算結果為 Boolean.TRUE 或等於 trueString(忽略大小寫),則停用測試。當應用於類級別時,該類中的所有測試方法也會自動停用。

表示式可以是以下任何一種

  • Spring Expression Language (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 支援,請確保從正確的包中匯入註解型別。

© . This site is unofficial and not affiliated with VMware.