@TestBean

@TestBean 用於測試類別中的欄位,以工廠方法提供的實例覆寫測試 ApplicationContext 中的特定 Bean。

相關聯的工廠方法名稱衍生自註解欄位的名稱,或指定的 Bean 名稱。工廠方法必須是 static、不接受任何引數,並且具有與要覆寫的 Bean 類型相容的傳回類型。為了更明確,或者如果您想使用不同的名稱,註解允許提供特定的方法名稱。

預設情況下,註解欄位的類型用於搜尋要覆寫的候選 Bean。如果有多個候選項目符合,則可以提供 @Qualifier 來縮小要覆寫的候選範圍。或者,Bean 名稱與欄位名稱相符的候選項目也會符合。

如果不存在對應的 Bean,則會建立一個 Bean。但是,如果您希望在不存在對應的 Bean 時測試失敗,您可以將 enforceOverride 屬性設定為 true – 例如,@TestBean(enforceOverride = true)

若要使用按名稱覆寫而不是按類型覆寫,請指定註解的 name 屬性。

限定詞(包括欄位名稱)用於判斷是否需要建立單獨的 ApplicationContext。如果您在多個測試中使用此功能來覆寫相同的 Bean,請確保欄位名稱一致,以避免建立不必要的 Context。

以下範例示範如何使用 @TestBean 註解的預設行為

  • Java

class OverrideBeanTests {
	@TestBean (1)
	private CustomService customService;

	// test case body...

	private static CustomService customService() { (2)
		return new MyFakeCustomService();
	}
}
1 標記欄位以覆寫類型為 CustomService 的 Bean。
2 此靜態方法的結果將用作實例並注入到欄位中。

在上述範例中,我們正在覆寫類型為 CustomService 的 Bean。如果存在多個該類型的 Bean,則會考慮名為 customService 的 Bean。否則,測試將會失敗,您需要提供某種限定詞來識別您要覆寫哪個 CustomService Bean。

以下範例使用按名稱查閱,而不是按類型查閱

  • Java

class OverrideBeanTests {
	@TestBean(name = "service", methodName = "createCustomService") (1)
	private CustomService customService;

	// test case body...

	private static CustomService createCustomService() { (2)
		return new MyFakeCustomService();
	}
}
1 標記欄位以覆寫名稱為 service 的 Bean,並指定工廠方法名為 createCustomService
2 此靜態方法的結果將用作實例並注入到欄位中。

Spring 在測試類別、測試類別階層以及封閉類別階層中搜尋要調用的工廠方法,以用於 @Nested 測試類別。

或者,可以使用完整的方法名稱(遵循語法 <fully-qualified class name>#<method name>)來參考外部類別中的工廠方法 – 例如,methodName = "org.example.TestUtils#createCustomService"

只能覆寫單例 Bean。任何覆寫非單例 Bean 的嘗試都會導致例外狀況。

當覆寫由 FactoryBean 建立的 Bean 時,FactoryBean 將被替換為與 @TestBean 工廠方法傳回的值相對應的單例 Bean。