1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
コース一覧
Spring Boot入門
モックで依存を差し替える

Spring Boot入門

Java で Web API サーバーを作るための Spring Boot の入門コースです。DI コンテナ、REST コントローラ、リクエスト検証、レイヤ分割、Spring Data JPA、例外ハンドリング、テストまでを扱います。毎レッスン、Spring が裏側でやっている判断そのものを pure Java の関数として自分で書き、フレームワークが何を肩代わりしてくれているのかを手触りで理解できる構成にしました。約 12 時間 (1 日 30 分 × 24 日) で 48 レッスンを修了できます。

1
Spring Bootとは何か
01. Spring Bootで何が作れるのか10分
02. サーブレットからフレームワークへ15分
03. ルーティング表という発想15分
04. プロジェクトの構成10分
05. 起動のしくみと自動設定15分
06. パスのマッチング15分
2
DIコンテナ
01. newで書くと何が困るのか15分
02. コンストラクタインジェクション15分
03. インターフェースへの依存15分
04. @Componentと@Bean15分
05. 自作のDIコンテナ20分
06. Beanのスコープとライフサイクル15分
3
RESTコントローラ
01. RESTという設計方針15分
02. @RestControllerの役割15分
03. @GetMappingとパス変数15分
04. クエリパラメータの受け取り15分
05. @PostMappingとリクエストボディ15分
06. ステータスコードの選び方15分
07. ResponseEntityで組み立てる15分
4
リクエストとレスポンスの変換
01. JSONとオブジェクトの往復15分
02. DTOとエンティティを分ける15分
03. recordでDTOを書く15分
04. 入力検証の基本15分
05. 検証エラーをまとめて返す15分
06. アノテーションによる検証15分
5
レイヤ構成とビジネスロジック
01. 3層アーキテクチャ10分
02. @Serviceに置くもの15分
03. 状態遷移をルールにする15分
04. 料金計算のような業務ロジック15分
05. @Transactionalとは何か15分
06. トランザクションの巻き戻し15分
6
データアクセス
01. @Entityとテーブルの対応15分
02. リポジトリという抽象15分
03. メソッド名からクエリを作る20分
04. 検索条件の組み立て15分
05. ページングと並び替え15分
06. N+1問題15分
7
例外処理と横断的関心事
01. 例外をHTTPに変換する15分
02. @ExceptionHandlerと@ControllerAdvice15分
03. エラーレスポンスの形を決める15分
04. フィルタとインターセプタ15分
05. ログとリクエストの追跡15分
06. 設定値の外部化15分
8
テストと仕上げ
01. テストの種類と使い分け15分
02. Serviceの単体テスト15分
03. モックで依存を差し替える15分
04. MockMvcでエンドポイントを試す15分
05. 本番へ出すための次の一歩10分

モックで依存を差し替える

このレッスンでは、テストのために依存を偽物へ差し替える手口を整理し、呼び出し回数を数える偽実装を自分で書けるようになります。

偽物には3つの呼び名があります

テスト用の偽物は、役割によって呼び分けられています。境目は厳密ではありませんが、狙いが違います。

呼び名役割主に確かめること
スタブ (stub)決まった値を返すだけ戻り値を受けた側の振る舞い
モック (mock)呼ばれ方を検証する正しく呼ばれたかどうか
スパイ (spy)記録を取りつつ動く呼び出し回数や引数

スタブは「このメソッドを呼んだらこの値を返す」とだけ決めておく置物です。データベースから見つからなかった場合を再現したいときなどに使います。モックは逆に、戻り値より呼ばれたという事実のほうが関心事です。メールを送る処理なら、送信そのものはテストで実行したくないけれど、1回だけ呼ばれたことは確かめたい、といった場面です。スパイはその中間で、記録を取りながら実際の処理も動かします。

Mockito の2つの動詞

Java では Mockito というライブラリがこの役目を担います。使う命令はほぼ2つに集約されます。

Java

// 準備 — この呼び出しにはこの値を返させる when(userRepository.findById(1L)).thenReturn(Optional.of(user)); // 検証 — この呼び出しがちょうど1回起きたことを確かめる verify(mailSender, times(1)).send("alice@example.com");

when と thenReturn の組がスタブの宣言です。verify が呼ばれ方の検証で、times(1) のほか never() や atLeastOnce() を渡せます。値を返さない void のメソッドは when で包めないので、こういうメソッドこそ verify の出番になります。

@MockBean はコンテナの中身を置き換えます

ここまでは Spring と無関係です。new して渡すだけなら、モックはただのオブジェクトだからです。一方、@WebMvcTest や @SpringBootTest のようにコンテナが起動するテストでは、コンテナが持っている Bean を差し替える必要があります。それをやるのが @MockBean です。

Java

@WebMvcTest(UserController.class) class UserControllerTest { @Autowired MockMvc mockMvc; @MockBean UserService userService; // コンテナ内の UserService をモックに置換 }

@MockBean を書くと、同じ型の Bean がコンテナにあれば置き換え、なければ追加します。コントローラに注入されるのはこのモックになります。

混同しやすいのは @Mock との違いです。@Mock は Mockito 単体のアノテーションで、コンテナには一切触れません。Spring を起動しない単体テストで使うものです。逆に、Spring を起動しないテストで @MockBean を書いても意味がありません。差し替える先のコンテナが存在しないからです。コンテナが立っているかどうかが使い分けの分かれ目になります。

モックを使いすぎない

最後に注意点をひとつ挙げます。モックは、対象が本当にそう振る舞うかではなく、自分が決めた振る舞いを返します。すべてをモックで固めたテストは、実装を書き換えても常に緑のまま通ってしまう可能性があります。差し替えるのは、遅いもの、外部にあるもの、再現しづらいものに留めるのが健全です。純粋な計算は本物のまま呼びます。

演習で書くこと

Mockito が裏でやっていることを自分の手で作ります。メール送信のインターフェースに対して、呼ばれた回数を数える偽の実装を書き、それを Service に渡して動かします。最後に verify に相当する確認として、呼び出し回数と処理結果をまとめて返します。

要件

  1. SpyMailSender の send は calls を 1 増やしてから、コンストラクタで受け取った result を返すこと
  2. notifyAll は csv をカンマで分解し、空文字列の宛先を読み飛ばしたうえで send を呼び、true が返った件数を返すこと
  3. verify は calls=2,ok=2 のように、呼び出し回数と成功件数をつないだ文字列を返すこと

入出力例

verify("a@example.com,b@example.com", true) → "calls=2,ok=2" verify("a@example.com,b@example.com,c@example.com", false) → "calls=3,ok=0" verify("solo@example.com", true) → "calls=1,ok=1" verify("", true) → "calls=0,ok=0" verify("a@example.com,,b@example.com", true) → "calls=2,ok=2"

ヒント

csv の分解は csv.split(",") で行えます。要素が空文字列かどうかは isEmpty() で判定できます

空文字列の宛先は send を呼ばずに continue で飛ばすので、calls にも数えられません

戻り値の組み立ては "calls=" + spy.calls + ",ok=" + ok の形で書けます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • MockMvcでエンドポイントを試す

    リクエストの組み立てから期待する結果までを検証します。

  • 本番へ出すための次の一歩

    ビルド、プロファイル、セキュリティなど次に学ぶ範囲を見通します。

  • Serviceの単体テスト

    依存を差し替えて業務ロジックだけを検証します。

  • テストの種類と使い分け

    @SpringBootTest と @WebMvcTest の違いを確認します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • テストバグを見つける工程
  • 戻り値呼び出し元への返答を表す点線矢印
  • 引数位置引数=順番で渡す。
  • メソッドクラスに属する関数
  • データベースデータを構造化して保存する仕組み
  • 処理計算や代入を表す長方形
  • 集約複数の値を 1 つの結果にまとめる操作
  • コンテナデータ取得や状態を担う上位コンポーネント
main.java
学習モード
エディタを読み込んでいます

メモ

モックで依存を差し替える

⌘S で保存