はじめに
「同じ変更を2つのファイルに入れる」作業をして、最後に ./gradlew test。…全部緑🎉 やったー、完成!
…と思って実際に動かしたら、片方の機能だけ動いていませんでした。テストは緑なのに、です。
“全部緑”に、まんまと油断しました😅
なぜ緑なのに片方は動いていなかったのか。気づくきっかけ(git status)と、そこから学んだ「緑を信じすぎない」小さな習慣を残します。
環境
- Java 21 / Spring Boot 3.5.14
- テスト:JUnit 5
- Gradle
起きたこと
投稿(Post)とコメント(Comment)の削除に、同じ権限チェックを足す作業でした。内容は「自分のもの、または管理者なら削除OK」。それまでは「自分のものだけ削除OK」でした。
PostController にこう入れて、「管理者は他人の投稿も消せる」テストも追加:
boolean isOwner = auth.getName().equals(post.getOwner());
boolean isAdmin = auth.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"));
if (!isOwner && !isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN);
}
同じことを CommentController にも…入れたつもりで ./gradlew test:
BUILD SUCCESSFUL
(全部緑)
完成!と思ったのですが、管理者で試すと投稿は他人のも消せるのに、コメントは他人のを消せない(403)。コメント側だけ、古い「自分のものだけ」のままでした。
原因
git status を見て、すぐ分かりました。
$ git status --short
M src/main/java/com/example/demo/PostController.java
M src/test/java/com/example/demo/PostControllerTest.java
← CommentController と そのテストが「M」に無い!
CommentController とそのテストを、そもそも変更していませんでした(適用し忘れ)。
…ここで「でも、なんでテストは緑だったの?」と引っかかります。理由はこうでした👇
- 忘れていた
CommentControllerも、その**テストも両方“古いまま”**だった。 - 古いテストは「自分のコメントを削除できる」ことだけを見ていて、「管理者なら他人のも削除できる」までは見ていなかった。
- だから「自分のものだけ削除」の古いコードでも、テストは落ちなかった。新しい動作(管理者の削除)には、コメント側にそもそもテストが無い=落ちようがない。
結局、テストは自分が書いた分しか見てくれません。変え忘れたところは、赤くなって教えてくれないんですね。
解決
-
git status(またはgit diff --stat)で、変えたつもりのファイルが全部Mになっているかを最終チェック。 - 抜けていた
CommentControllerとそのテストを適用。 - もう一度
./gradlew test→ 今度は本当に全部緑。
$ git status --short
M src/main/java/com/example/demo/PostController.java
M src/main/java/com/example/demo/CommentController.java
M src/test/java/com/example/demo/PostControllerTest.java
M src/test/java/com/example/demo/CommentControllerTest.java
「変更したファイルの数」が、頭の中の想定と合っているか。これを見るだけで防げました。
学び
- 全部緑 ≠ 全部できた。 テストは“書いた範囲”しか守ってくれない。
- 同じ変更を複数ファイルに入れる時ほど「適用漏れ」が起きる。
git statusを「やったことの答え合わせ」に使う。 - 古い実装と古いテストが噛み合っていると、変え忘れが緑をすり抜ける。テストの盲点として覚えておく。
おわりに
「緑だから大丈夫」と思った瞬間こそ、git status をひと目見る——という小さな習慣メモです😅 同じように、複数ファイルの変更で片方を取りこぼした人の参考になれば嬉しいです🙌