Spring JUnit Jupiter 測試註解

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

@SpringJUnitConfig

@SpringJUnitConfig 是一個組合註解,它將 JUnit Jupiter 的 @ExtendWith(SpringExtension.class) 與 Spring TestContext Framework 的 @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 Framework 的 @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@javax.inject.Inject 優先於 @TestConstructor 和預設模式。

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

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

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

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

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

@NestedTestConfiguration

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

如果在測試類本身、其超類層次結構或其封閉類層次結構中不存在或未元存在 @NestedTestConfiguration,則將使用預設的 封閉配置繼承模式。有關如何更改預設模式的詳細資訊,請參閱下面的提示。

更改預設封閉配置繼承模式

預設的 封閉配置繼承模式INHERIT,但可以透過將 spring.test.enclosing.configuration JVM 系統屬性設定為 OVERRIDE 來更改。此外,也可以透過 SpringProperties 機制設定預設模式。

Spring TestContext Framework 遵循以下註解的 @NestedTestConfiguration 語義。

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

有關示例和更多詳細資訊,請參閱@Nested 測試類配置

@EnabledIf

@EnabledIf 用於表示如果提供的 expression 計算結果為 true,則帶註解的 JUnit Jupiter 測試類或測試方法將被啟用並應執行。具體來說,如果表示式計算結果為 Boolean.TRUE 或與 true 相等(不區分大小寫)的 String,則測試被啟用。當應用於類級別時,預設情況下,該類中的所有測試方法也會自動啟用。

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

  • 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 或與 true 相等(不區分大小寫)的 String,則測試被停用。當應用於類級別時,該類中的所有測試方法也會自動停用。

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

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