1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
  8. test 8
コース一覧
Spring Boot入門
MockMvcでエンドポイントを試す

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分

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

このレッスンでは、MockMvc が何をしているのかを理解し、リクエストと期待する結果を突き合わせる判定を自分で書けるようになります。

実サーバーを立てずにディスパッチャを通します

コントローラのテストで困るのは、HTTP を通すと遅くなり、通さないと本物と違うものを確かめてしまうことです。MockMvc はその真ん中を取ります。Tomcat のような実サーバーは起動せず、しかし DispatcherServlet には本当に通すという仕組みです。

このコースの序盤で見たとおり、Spring MVC のリクエスト処理はディスパッチャが中心にいて、そこからルーティング表の照合、パス変数の抽出、本文の JSON からオブジェクトへの変換、検証、ハンドラの呼び出し、戻り値の JSON への変換、という順で進みます。MockMvc はこの一連の流れをそのまま実行します。省略されるのはソケットの部分だけです。だから @PathVariable の取り出しミスも @Valid の付け忘れも、MockMvc でちゃんと見つかります。

perform と andExpect

書き方は決まった形をしています。

Java

@WebMvcTest(UserController.class) class UserControllerTest { @Autowired MockMvc mockMvc; @MockBean UserService userService; @Test void 一覧は200を返す() throws Exception { mockMvc.perform(get("/users")) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name").value("alice")); } }

perform にリクエストを渡して実行し、andExpect に期待することを並べます。andExpect はいくつでも重ねられ、ひとつでも満たされなければテストが失敗します。

リクエストの組み立てには get、post、put、delete を使います。本文やヘッダを付けたい場合は続けて指定します。

Java

mockMvc.perform(post("/users") .contentType(MediaType.APPLICATION_JSON) .content("{\"name\":\"alice\"}")) .andExpect(status().isCreated());

contentType を忘れると、Spring は本文をどう解釈すればよいか分からず 415 を返します。POST のテストが 415 で落ちるときは、たいていこれです。

期待の書き方

よく使う andExpect の中身は次の通りです。

書き方確かめること
status().isOk()ステータスが 200
status().isCreated()ステータスが 201
status().isNotFound()ステータスが 404
status().isBadRequest()ステータスが 400
jsonPath("$.name").value("alice")JSON の該当項目の値
content().string("ok")本文が文字列として一致
header().string("Location", "/users/1")ヘッダの値

jsonPath は JSON の中の位置を式で指す書き方です。$ が根で、$.name が最上位の name、$[0].name が配列の先頭要素の name を指します。本文全体を文字列として比較すると項目の順番が変わっただけで落ちるので、JSON を返すエンドポイントでは jsonPath のほうが壊れにくくなります。

デバッグに効く一行

期待が外れたのに理由が分からないときは、andDo(print()) を挟むと実際のリクエストとレスポンスの全体が出力されます。ステータスもヘッダも本文も見えるので、推測でアサーションを書き換える前にこれを使ってください。

演習で書くこと

MockMvc がやっている「ディスパッチャを通して、返ってきたものを期待と突き合わせる」という2段階を自分で書きます。メソッドとパスからレスポンスを決める簡易ディスパッチャと、その結果をステータスと本文の両面で期待と比べ、pass か fail を返す判定を作ります。andExpect を重ねたときの「ひとつでも外れたら失敗」という性質も、そのまま再現します。

要件

  1. dispatch は method と path から MockResponse を組み立て、説明にある順番で判定すること
  2. GET /users/ に続く部分を id として取り出し、1 のときだけ 200 と alice を返すこと
  3. perform はステータスと本文の両方が期待と一致したときだけ pass を返し、それ以外は fail を返すこと

入出力例

perform("GET", "/users", 200, "list") → "pass" perform("POST", "/users", 201, "created") → "pass" perform("GET", "/users/1", 200, "alice") → "pass" perform("GET", "/users/9", 404, "not found") → "pass" perform("DELETE", "/users", 405, "method not allowed") → "pass" perform("GET", "/health", 404, "not found") → "pass" perform("GET", "/users", 200, "users") → "fail" perform("POST", "/users", 200, "created") → "fail"

ヒント

パスの前方一致は path.startsWith("/users/") で判定できます。id の取り出しは path.substring("/users/".length()) です

判定の順番が大事です。ちょうど /users の場合を先に片付けてから、前方一致の枝へ進みます

record の値は res.status() と res.body() のように、フィールド名と同じ名前のメソッドで取り出します

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

関連レッスン

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

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

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

    呼び出し回数を記録する偽の実装を作れるようになります。

  • Serviceの単体テスト

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

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

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

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

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

  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • テストバグを見つける工程
  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • 処理計算や代入を表す長方形
  • ルーティングURLパスとHTTPメソッドに応じて処理を振り分ける仕組み。
  • 変数データに名前をつけて参照する仕組み
  • applicationJSON 本文を送るときの Content-Type
main.java
学習モード
エディタを読み込んでいます

メモ

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

⌘S で保存