@MockitoBean
和 @MockitoSpyBean
@MockitoBean
和 @MockitoSpyBean
用於測試類別中的欄位,以使用 Mockito mock 或 spy 分別覆寫測試 ApplicationContext
中的 beans。在後一種情況下,會擷取原始 bean 的早期實例並由 spy 包裝。
預設情況下,會使用註解欄位的類型來搜尋要覆寫的候選 bean。如果多個候選項目符合,則可以提供 @Qualifier
以縮小要覆寫的候選項目範圍。或者,bean 名稱與欄位名稱相符的候選項目也會符合。
使用 @MockitoBean
時,如果不存在對應的 bean,則會建立新的 bean。但是,如果您希望在不存在對應的 bean 時測試失敗,您可以將 enforceOverride
屬性設定為 true
– 例如,@MockitoBean(enforceOverride = true)
。
若要使用依名稱覆寫而非依類型覆寫,請指定註解的 name
屬性。
限定詞,包括欄位的名稱,用於判斷是否需要建立個別的 |
每個註解也定義了 Mockito 特定的屬性,以微調 mocking 詳細資訊。
預設情況下,@MockitoBean
註解使用 REPLACE_OR_CREATE
策略進行測試 bean 覆寫。如果沒有現有的 bean 符合,則會即時建立新的 bean。如先前所述,您可以將 enforceOverride
屬性設定為 true
來切換到 REPLACE
策略。
@MockitoSpyBean
註解使用 WRAP
策略,並且原始實例會包裝在 Mockito spy 中。此策略要求正好存在一個候選 bean。
只有單例 bean 可以被覆寫。任何覆寫非單例 bean 的嘗試都會導致例外。 當使用 當使用 |
以下範例示範如何使用 @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。 |