Skip to content

Spring Boot 3.4.0 の非推奨@MockBeansの代替方法

問題の背景

Spring Boot 3.4.0 から @MockBean@MockBeans が非推奨となり、代わりに @MockitoBean の使用が推奨されています。多くのプロジェクトではテストクラスで一括モック定義を行うため、以下のようなカスタムアノテーションを使用していました:

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockBeans({
    @MockBean(ServiceA.class),
    @MockBean(ServiceB.class),
    @MockBean(ServiceC.class) // ...20以上のサービス
})
public @interface MyMocksTest {}

しかし @MockitoBean には複数のモックをまとめる@MockitoBeans 相当のアノテーションが存在しないため、依存性の多いテストクラスのモック定義が困難になる問題が発生します。

ソリューション: クラスレベルでの @MockitoBean 利用

単一クラスでの解決方法

クラスレベルで @MockitoBean を使用し、types 属性にモック対象クラスの配列を指定します:

java
import org.springframework.test.context.bean.override.mockito.MockitoBean;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoBean(types = {
    ServiceA.class,
    ServiceB.class,
    ServiceC.class, // ...必要なサービスを列挙
})
public @interface MyMocksTest {}

カスタムアノテーション経由での利用

モック定義を再利用可能にするカスタムアノテーションの例:

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoBean(types = ServiceA.class)
@MockitoBean(types = ServiceB.class)
@MockitoBean(types = ServiceC.class)
public @interface MyMocksConfiguration {}
java
@SpringBootTest
@MyMocksConfiguration // カスタムアノテーション適用
class MyServiceTest {
    // テストコード...
}

フィールドレベルの移行方法

java
// 非推奨
@MockBean private ServiceA serviceA; 

// 新しいアプローチ
@MockitoBean private ServiceA serviceA;

@SpyBean の移行

java
// 非推奨
@SpyBean private ServiceB serviceB;

// 新しいアプローチ
@MockitoSpyBean private ServiceB serviceB;

重要ポイント

  1. 即時移行の必要性

    • @MockBean/@MockBeans は Spring Boot 3.5.0 で削除予定
    • プロジェクトの持続性のために早期移行を推奨
  2. 移行の基本原理

    • クラスレベルの複数モック指定は @MockitoBean(types={...}) で実現
    • 複数の @MockitoBean を同一クラスに直接適用可能(Javaの繰り返しアノテーション)
    • メタアノテーション作成で設定を抽象化可能
  3. 公式ドキュメント

注意点

非推奨アノテーションを一時的に使用する場合でも、Spring Boot 3.5.0 リリース前に移行を完了する必要があります。大規模テストスイートではカスタムアノテーションを活用し、一括変更可能な設計にすることが重要です。

この移行により、Spring Bootの最新テスト機能を安全に利用しながら、テストコードの保守性を保つことができます。