TODO のまま残っている遷移テストを Claude Code に書かせ、値と例外型まで見ているかを確かめてから採用します。
| 書く | src/TODO 4件をテストに置き換える |
| 書く | src/遷移ルールの確認と一時的な書き換え |
| 読む | docs/採否の基準。既知バグの赤は除く |
- Tests run の合計が配布時の9件から、自分が足した本数ぶん増えている
- 異常系のテストが assertThatThrownBy で例外型まで指定されている
- 赤の内訳を言える。配布時からの DELIVERED キャンセルが1件、CONFIRMED から CANCELLED は D1-5 を取り込んでいれば緑、未了なら2件目の赤になる
くわしく(背景・詰まったときの対処)
OrderServiceImplTest は findById・createOrder・changeStatus・cancelOrder・findAll の代表ケースが正常系・異常系とも実装済みで、changeStatus の @Nested に4件の TODO コメントが残っています。CONFIRMED から SHIPPED、SHIPPED から DELIVERED、CANCELLED からの遷移は全部不可、同一ステータスへの遷移は不可、の4件です。テスト基盤は組んであるので @ExtendWith や @Mock を書き足す必要はありません。AssertJ の assertThat と assertThatThrownBy、Mockito の when と verify、既存テストと同じ書き方に揃えるだけです。追記先は既存ファイルで、新規ファイルは作りません。
.\mvnw.cmd test -Dtest=OrderServiceImplTest は9件中1件が赤です。Day2 で初めてテストを走らせると赤が1件出ますが、これは配布時点で仕込んである失敗で、環境の不備ではありません。DELIVERED の受注をキャンセルできてしまう穴が cancelOrder に残っていて、例外が出ずにキャンセルが通り、スタブしていない save が null を返すので、続く行で NullPointerException になります。画面に出るのは expecting ... InvalidOrderStateException but was ... NullPointerException の行です。Day3 の題材なので、今日は直しません。走らせる前に配布時点の状態を一度見ておくと、自分が足したテストの失敗と切り分けやすくなります。
@ を打つと候補が出るので、ファイル名でもパスでも選べます。実行結果の読み方には癖がひとつ。Maven のコンソールに出るのはクラス単位の集計行と落ちたテストの名前だけで、通ったテストのメソッド名は表示されません。名前まで確かめたいときは target/surefire-reports/TEST-com.example.order.service.OrderServiceImplTest$ChangeStatusTest.xml を開き、testcase name に自分が足したメソッド名が並ぶのを見てください。
同一ステータスへの遷移には専用のチェック文がありませんが、どの case も自分自身を遷移先に挙げていないので例外が出ます。このテストは配布時点でも緑です。もうひとつ、CONFIRMED から CANCELLED が成功する前提のテストは、Day1 の D1-5 を済ませていなければ落ちます。落ちたときは validateStatusTransition の CONFIRMED の case を開いて、SHIPPED しか許していないことを自分で確かめてください。生成物の誤りなのか実装の穴なのかは、ここが分かれ目です。採否の基準は docs/生成物チェックリスト.md の B-5 に書いてあります。
