@MockitoBean@MockitoSpyBean

@MockitoBean@MockitoSpyBean 用於測試類別中的欄位,以使用 Mockito mockspy 分別覆寫測試 ApplicationContext 中的 beans。在後一種情況下,會擷取原始 bean 的早期實例並由 spy 包裝。

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

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

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

限定詞,包括欄位的名稱,用於判斷是否需要建立個別的 ApplicationContext。如果您在多個測試中使用此功能來 mock 或 spy 同一個 bean,請確保欄位名稱一致,以避免建立不必要的 context。

每個註解也定義了 Mockito 特定的屬性,以微調 mocking 詳細資訊。

預設情況下,@MockitoBean 註解使用 REPLACE_OR_CREATE 策略進行測試 bean 覆寫。如果沒有現有的 bean 符合,則會即時建立新的 bean。如先前所述,您可以將 enforceOverride 屬性設定為 true 來切換到 REPLACE 策略。

@MockitoSpyBean 註解使用 WRAP 策略,並且原始實例會包裝在 Mockito spy 中。此策略要求正好存在一個候選 bean。

只有單例 bean 可以被覆寫。任何覆寫非單例 bean 的嘗試都會導致例外。

當使用 @MockitoBean 來 mock 由 FactoryBean 建立的 bean 時,FactoryBean 將被替換為由 FactoryBean 建立的物件類型的單例 mock。

當使用 @MockitoSpyBeanFactoryBean 建立 spy 時,將為由 FactoryBean 建立的物件建立 spy,而不是為 FactoryBean 本身建立 spy。

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

  • Java

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

	// test case body...
}
1 將類型為 CustomService 的 bean 替換為 Mockito mock

在上面的範例中,我們正在為 CustomService 建立 mock。如果存在多個該類型的 bean,則會考慮名為 customService 的 bean。否則,測試將會失敗,您將需要提供某種類型的限定詞來識別您要覆寫哪個 CustomService bean。如果不存在此類 bean,則將建立具有自動產生的 bean 名稱的 bean 定義。

以下範例使用依名稱查找,而不是依類型查找

  • Java

class OverrideBeanTests {
	@MockitoBean("service") (1)
	private CustomService customService;

	// test case body...

}
1 將名為 service 的 bean 替換為 Mockito mock

如果不存在名為 service 的 bean 定義,則會建立一個。

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

  • Java

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

	// test case body...
}
1 使用 Mockito spy 包裝類型為 CustomService 的 bean。

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

以下範例使用依名稱查找,而不是依類型查找

  • Java

class OverrideBeanTests {
	@MockitoSpyBean("service") (1)
	private CustomService customService;

	// test case body...

}
1 使用 Mockito spy 包裝名為 service 的 bean。