@MockitoBean
および @MockitoSpyBean
@MockitoBean
と @MockitoSpyBean
は、テストクラスの非静的フィールドで使用され、テストの ApplicationContext
の Bean をそれぞれ Mockito モックまたは spy でオーバーライドします。後者の場合、元の Bean の初期インスタンスがスパイによってキャプチャーされ、ラップされます。
デフォルトでは、アノテーション付きフィールドの型を使用して、オーバーライドする候補 Bean を検索します。複数の候補が一致する場合、オーバーライドする候補を絞り込むために @Qualifier
を指定できます。または、Bean 名がフィールド名と一致する候補が一致します。
フィールド名などの修飾子は、別の |
各アノテーションは、モック動作を微調整するための Mockito 固有の属性も定義します。
@MockitoBean
アノテーションは、テスト Bean のオーバーライドに REPLACE_OR_CREATE
戦略を使用します。一致する既存の Bean がない場合、新しい Bean がオンザフライで作成されます。ただし、enforceOverride
属性を true
に設定することで、REPLACE
戦略に切り替えることができます。例については、次のセクションを参照してください。
@MockitoSpyBean
アノテーションは WRAP
戦略を使用し、元のインスタンスは Mockito スパイにラップされます。この戦略では、候補となる Bean が 1 つだけ存在する必要があります。
オーバーライドできるのはシングルトン Bean のみです。非シングルトン Bean をオーバーライドしようとすると、例外が発生します。
|
このようなフィールドは、プロジェクトのニーズやコーディング方法に応じて、 |
@MockitoBean
の例
@MockitoBean
を使用する場合、対応する Bean が存在しない場合は新しい Bean が作成されます。ただし、対応する Bean が存在しない場合にテストを失敗させたい場合は、enforceOverride
属性を true
に設定できます (例: @MockitoBean(enforceOverride = true)
)。
型によるオーバーライドではなく名前によるオーバーライドを使用するには、アノテーションの name
(または value
) 属性を指定します。
次の例は、@MockitoBean
アノテーションのデフォルトの動作を使用する方法を示しています。
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoBean (1)
CustomService customService;
// tests...
}
1 | 型 CustomService の Bean を Mockito mock に置き換えます。 |
上記の例では、CustomService
のモックを作成しています。その型の Bean が複数存在する場合は、customService
という名前の Bean が考慮されます。そうでない場合、テストは失敗し、オーバーライドする CustomService
Bean を識別するために何らかの修飾子を指定する必要があります。そのような Bean が存在しない場合は、自動生成された Bean 名で Bean が作成されます。
次の例では、型による検索ではなく、名前による検索を使用しています。
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoBean("service") (1)
CustomService customService;
// tests...
}
1 | service という名前の Bean を Mockito mock に置き換えます。 |
service
という名前の Bean が存在しない場合は、作成されます。
@MockitoBean
は型レベルでも使用できます。
テストクラス、またはテストクラスの上位の型階層にあるスーパークラスまたは実装されたインターフェース
@Nested
テストクラスの包含クラス、または@Nested
テストクラスの上位の型階層または包含クラス階層内の任意のクラスまたはインターフェース
@MockitoBean
が型 レベルで宣言されている場合、モックする Bean (または Bean) の型は、types
属性を介して指定する必要があります (例: @MockitoBean(types = {OrderService.class, UserService.class})
)。アプリケーションコンテキストに複数の候補が存在する場合は、name
属性を設定することで、モックする Bean 名を明示的に指定できます。ただし、明示的な Bean name
が構成されている場合、types
属性には単一の型 (例: @MockitoBean(name = "ps1", types = PrintingService.class)
) を含める必要があることに注意してください。
モック構成の再利用をサポートするために、@MockitoBean
をメタアノテーションとして使用して、カスタム合成アノテーションを作成できます。たとえば、テストスイート全体で再利用できる共通のモック構成を単一のアノテーションで定義できます。@MockitoBean
は、型レベルで繰り返し可能なアノテーションとして使用することもできます。たとえば、複数の Bean を名前でモックできます。
次の @SharedMocks
アノテーションは、型によるモック 2 つと名前によるモック 1 つを登録します。
Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoBean(types = {OrderService.class, UserService.class}) (1)
@MockitoBean(name = "ps1", types = PrintingService.class) (2)
public @interface SharedMocks {
}
1 | OrderService および UserService モックを型別に登録します。 |
2 | PrintingService のモック名を登録します。 |
以下は、@SharedMocks
をテストクラスで使用する方法を示しています。
Java
@SpringJUnitConfig(TestConfig.class)
@SharedMocks (1)
class BeanOverrideTests {
@Autowired OrderService orderService; (2)
@Autowired UserService userService; (2)
@Autowired PrintingService ps1; (2)
// Inject other components that rely on the mocks.
@Test
void testThatDependsOnMocks() {
// ...
}
}
1 | カスタム @SharedMocks アノテーションを介して共通モックを登録します。 |
2 | 必要に応じて、モックを挿入してスタブ化または検証します。 |
モックは、@Configuration クラスまたは ApplicationContext 内のその他のテスト関連コンポーネントに挿入して、Mockito のスタブ API を使用して構成することもできます。 |
@MockitoSpyBean
の例
次の例は、@MockitoSpyBean
アノテーションのデフォルトの動作を使用する方法を示しています。
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean (1)
CustomService customService;
// tests...
}
1 | CustomService 型の Bean を Mockito spy でラップします。 |
上記の例では、Bean を型 CustomService
でラップしています。その型の Bean が複数存在する場合は、customService
という名前の Bean が考慮されます。そうでない場合、テストは失敗し、スパイする CustomService
Bean を識別するために何らかの修飾子を提供する必要があります。
次の例では、型による検索ではなく、名前による検索を使用しています。
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean("service") (1)
CustomService customService;
// tests...
}
1 | service という名前の Bean を Mockito spy でラップします。 |