@TestBean
@TestBean
用於測試類別中的欄位,以工廠方法提供的實例覆寫測試 ApplicationContext
中的特定 Bean。
相關聯的工廠方法名稱衍生自註解欄位的名稱,或指定的 Bean 名稱。工廠方法必須是 static
、不接受任何引數,並且具有與要覆寫的 Bean 類型相容的傳回類型。為了更明確,或者如果您想使用不同的名稱,註解允許提供特定的方法名稱。
預設情況下,註解欄位的類型用於搜尋要覆寫的候選 Bean。如果有多個候選項目符合,則可以提供 @Qualifier
來縮小要覆寫的候選範圍。或者,Bean 名稱與欄位名稱相符的候選項目也會符合。
如果不存在對應的 Bean,則會建立一個 Bean。但是,如果您希望在不存在對應的 Bean 時測試失敗,您可以將 enforceOverride
屬性設定為 true
– 例如,@TestBean(enforceOverride = true)
。
若要使用按名稱覆寫而不是按類型覆寫,請指定註解的 name
屬性。
限定詞(包括欄位名稱)用於判斷是否需要建立單獨的 |
以下範例示範如何使用 @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 在測試類別、測試類別階層以及封閉類別階層中搜尋要調用的工廠方法,以用於 或者,可以使用完整的方法名稱(遵循語法 |
只能覆寫單例 Bean。任何覆寫非單例 Bean 的嘗試都會導致例外狀況。 當覆寫由 |