@TestBean
@TestBean 用於測試類中的非靜態欄位,透過工廠方法提供的例項覆蓋測試的 ApplicationContext 中的特定 bean。
相關的工廠方法名稱來源於帶註解欄位的名稱,或者在指定時來源於 bean 名稱。工廠方法必須是 static,不接受任何引數,並且返回型別必須與要覆蓋的 bean 的型別相容。為了使其更明確,或者如果你想使用不同的名稱,該註解允許提供特定的方法名稱。
預設情況下,帶註解欄位的型別用於搜尋要覆蓋的候選 bean。如果有多個候選 bean 匹配,可以提供 @Qualifier 來縮小要覆蓋的候選範圍。或者,bean 名稱與欄位名稱匹配的候選 bean 將匹配。
如果不存在相應的 bean,則將建立一個 bean。但是,如果你希望在相應的 bean 不存在時測試失敗,可以將 enforceOverride 屬性設定為 true,例如 @TestBean(enforceOverride = true)。
要使用按名稱覆蓋而不是按型別覆蓋,請指定註解的 name 屬性。
|
限定符(包括欄位名稱)用於確定是否需要建立單獨的 |
|
將 有關更多詳細資訊和示例,請參閱 使用 bean 覆蓋的上下文層次結構。 |
|
對 因此,這些欄位和方法可以是 |
以下示例展示瞭如何使用 @TestBean 註解的預設行為
-
Java
class OverrideBeanTests {
@TestBean (1)
CustomService customService;
// test case body...
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)
CustomService customService;
// test case body...
static CustomService createCustomService() { (2)
return new MyFakeCustomService();
}
}
| 1 | 標記一個欄位以覆蓋名為 service 的 bean,並指定工廠方法名為 createCustomService。 |
| 2 | 此靜態方法的結果將用作例項並注入到欄位中。 |
|
要查詢要呼叫的工廠方法,Spring 會在宣告 或者,可以透過其完全限定方法名引用外部類中的工廠方法,遵循語法 |
|
當覆蓋非單例 bean 時,非單例 bean 將替換為與 類似地,當覆蓋由 |