🕒 学習時間
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レスポンス検証
}
解説
- get()でHTTPリクエストを構築
- param()で入力値を付与
- perform()で疑似実行
- 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)の体系化