1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Controllerクラスに実装するテストメソッド

1
Last updated at Posted at 2026-05-06

🕒 学習時間

10:00~11:00

🧑‍💻 実施した学習内容

1. 疑問点

performに渡す事で使われるメソッド一覧

2. 技術の概要

◾️何をするものか
Springのテスト(主にMockMvc)で perform() にリクエストを渡すと、そのリクエストに応じたHTTP操作(GET/POSTなど)を実行する仕組み。

◾️背景・目的(なぜ必要か)
Controllerのテストでは「HTTPリクエスト → レスポンス」の流れを再現する必要がある。
→ 実際にサーバーを起動せずに、疑似的にHTTP通信を再現するために MockMvc.perform() が使われる。

3. 内容

◾️ HTTPメソッド系

  • get("/path")
    → データ取得用のリクエスト。DBから情報を「取得するだけ」で副作用(更新など)は持たない設計が原則です

  • post("/path")
    → 新規データ登録。サーバー側の状態を変更する(例:ユーザー作成)

  • put("/path")
    → データの「全更新」。既存リソースを丸ごと置き換える用途

  • delete("/path")
    → データ削除。対象リソースを削除する

  • patch("/path")
    → データの「部分更新」。一部フィールドだけ変更する

👉 解説
これらはすべて MockMvcRequestBuilders の静的メソッドで、
HTTPプロトコルの動作をテスト内で再現するための入口。


◾️ リクエスト詳細設定

param("key", "value")

→ クエリパラメータ(URLの ?id=1 など)を付与する
例:/users?id=1

👉 解説
Controllerの @RequestParam に対応。
GETだけでなくPOSTでもフォーム形式で使われる。


content("{json}")

→ リクエストボディを設定(主にJSON)

contentType(MediaType.APPLICATION_JSON)

→ データ形式を指定

👉 解説
@RequestBody を使うAPIでは必須。
contentだけでは不十分で、contentTypeが無いとSpringがJSONとして解釈しない。


header("Authorization", "Bearer xxx")

→ HTTPヘッダーを追加

👉 解説
認証・トークン・カスタム情報を送る時に使用。
実務ではJWT認証テストで頻出。


sessionAttr("key", value)

→ セッションに値を格納

👉 解説
ログイン状態や一時データを再現するために使用。
HttpSession を使う古い設計で重要。


cookie(new Cookie("name", "value"))

→ Cookieを付与

👉 解説
セッションIDやトラッキング情報を再現する。
ブラウザ挙動の再現に近い。


◾️ 認証関連(Spring Security)

with(user("username"))

→ 認証済みユーザーとしてリクエスト

with(csrf())

→ CSRFトークン付与

👉 解説
Spring Securityを使う場合、これが無いと403エラーになる。
特にPOST/PUT/DELETEではCSRF必須。


マルチパート(ファイルアップロード)

multipart("/upload")

→ ファイルアップロード用リクエスト

👉 解説
MultipartFile を受け取るAPIのテストで使用。
通常のpostとは別の専用形式。


◾️ その他

accept(MediaType.APPLICATION_JSON)

→ レスポンスの形式を指定

👉 解説
「JSONで返してほしい」とサーバーに伝える。
REST APIではほぼ必須。


4. 用語定義

  • MockMvc:Springの擬似HTTP実行ツール
  • RequestBuilder:リクエスト内容を組み立てるオブジェクト
  • perform():リクエストを実行するメソッド
  • ResultActions:結果に対して検証を行うためのオブジェクト

5. 解決する課題・メリット

  • サーバー起動不要で高速テスト
  • Controller単体テストが可能
  • HTTPレベルの挙動を正確に検証できる

6. 使用する注意事項・デメリット

  • 実際のネットワーク通信は行われない
  • FilterやInterceptorの影響を見落とす可能性あり
  • 設定(Spring Securityなど)を正しく入れないと誤検知する

7. 類似技術との比較

技術 特徴 用途
MockMvc 軽量・高速 Controller単体テスト
WebTestClient Reactive対応 WebFlux
RestTemplate 実HTTP通信 結合テスト
TestRestTemplate SpringBoot統合 E2E寄り

8. インストール・環境構築

Spring Boot Starter Testを追加

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
</dependency>

9. 基本的な使い方・実装(サンプルコード)

@Autowired
private MockMvc mockMvc;

@Test
void testGetUser() throws Exception {
    mockMvc.perform(get("/users") // GETリクエスト生成
            .param("id", "1"))   // クエリパラメータ付与
        .andExpect(status().isOk()) // HTTPステータス確認
        .andExpect(jsonPath("$.name").value("Taro")); // JSONレスポンス検証
}

解説

  1. get()でHTTPリクエストを構築
  2. param()で入力値を付与
  3. perform()で疑似実行
  4. andExpect()で結果検証

10. デザインパターン(サンプルコード)

mockMvc.perform(
    post("/users")
        .content("{\"name\":\"Taro\"}")
        .contentType(MediaType.APPLICATION_JSON)
);

解説

  • Builderパターン
  • メソッドチェーンで段階的に構築
  • 可読性・拡張性が高い

11. アンチパターン(サンプルコード)

mockMvc.perform(post("/users").content("{\"name\":\"Taro\"}").contentType(MediaType.APPLICATION_JSON).param("a","1").param("b","2"));

解説

  • 可読性が低い
  • 修正コストが高い
  • テスト意図が不明確

12. 根拠の掲示

◾️[公式ドキュメント]
https://docs.spring.io/spring-framework/reference/testing/mockmvc.html

13. 次やること

  • andExpectの詳細(status / jsonPath / header)を深掘り
  • REST設計(GET/POSTの使い分け)を理解
  • Spring Security込みのテスト設計
  • 異常系テスト(400/401/403/500)の体系化
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?