JUnitのMockを例え話で理解したい!
はじめに
この記事はJUnitや単体テストを始めたばかりで、Mockをこれから学ぶ方、Mockを使ったことはあるけどなんとなく使っている方に向けた記事です。
私なりの理解を技術記事として投稿させて頂いておりますので、考え方の一つだと思って読んでください。
この記事のテーマ
この記事はJUnitのMockとは何なのかについて考える記事です。
私は、JUnitを学んでいた当初、単体テストを実行するためにMockをなんとなく使っていました。
ですが、単体テストの組み方に慣れてきたあたりで、「Mockって結局なんのことで、なんでこれでテストできたことになっているのか?」がわからなくなっていました。
色々な記事を見ても、ここでMockを定義するとテストできますという前提のような感じで実行の仕方を書いてある記事が多かった印象を受けました。
また、抽象的な説明をしてくれる記事もありましたが、私自身の中で腑に落ちるところまでは至りませんでした。
わかる人はわかっているし、抽象的な説明のほうが的を得ているのですが、私の中では上記の説明ではイメージができなかったので、何かに例えてMockが何なのかを考えました。
今回の記事では、その私の中での理解を共有させて頂いておりますので、皆様の理解の助けになれたら嬉しいです。
JUnitのMockを例え話で覚える
Mockを理解する上でのポイント
私たちがいまから考えるのは「あくまでも単体テストであること」に注意してください。
そんなの当たり前でしょ?と思われる方も多いと思いますが、私はこの考えが無意識的になくMockの理解に苦しみましたが、この考え方を前提に置くことでMockの存在意義の理解に近づけます。
単体テストを料理番組に例えてMockを理解する
まずは例えのストーリーから説明します。
あなたはある料理番組のディレクターであるとしましょう。
この番組では、放送時間内で的確にわかりやすく視聴者にレシピを伝えることが目的です。今日は出演してもらう料理家の方に撮影前のテストをしてもらうために来てもらいました。撮影本番ではアシスタントさんがいますが、今回は料理家の方の流れのチェックのみをやりますので、今日はアシスタントの方はいません。
本番であれば、料理家の方が料理を進める際に、アシスタントさんが材料の加工をしたりなど用意をする予定になっていますが、リハーサルでは食材は最初から置いておいて必要なときに取って使うことしました。
このような進め方で料理家の方のリハーサルは無事完了しましたのテストはOKと判断されました。
さて、勘の良い皆様はお気づきだと思いますが、上記の例え話では、アシスタントさんがいない状況なので、料理を事前に用意しており、これがMockに該当します。
ここで人によっては、「さっきのリハーサルだと番組としてのテストはできないんじゃないの?」「それでOKって言っていいの?」と感じる方もいらっしゃると思います。(私がそうでした、、)
結論からお答えすると番組全体のリハーサルはできていません。
ですが、今回はこれで問題ないんです。
なぜなら、今回のテストはあくまで単体テストであるためです。
番組全体のテストを厳密にしっかりリハーサルしたいのであれば、料理家の方だけでなくアシスタントさんもスケジュールを合わせて一緒にリハーサルをする必要がありましたが、今回は料理家の方との番組の流れのチェックであり、料理家の方が担当するフローのみがテストできればよいのです。
これがわかっているか否かでMockの理解が違ってきます。
繰り返しになりますが、今回のリハーサルは料理家の方が担当するフローのみがテストできればよいので、本番ではアシスタントさんが提供してくれるような材料はアシスタントさんが出す必要ななく、料理家の方が欲しいと言ったときに出てくるものが一緒なら何でもいいのです。
つまりアシスタントさんが本来行う処理を無視して、インプットとアウトプットだけを一緒にして、アシスタントさんがいる場合と結果が同じになるようにしているのです。
このように、あるインプットがあったら、中身の処理を無視して欲しいアウトプットができる部品がMockです。
これによって、JUnitの単体テストでは、テストしたい対象の処理さえ組むことができていれば、その処理のなかで使う他の部品が完成していなくてもテストが可能となるわけです。
最後に
今回は私がMockの理解をする際につまづいた内容をお伝えさせていただきました。
この記事ではあくまでMockの考え方を例えてお話ししているので、Mockのしっかりした定義は参考文献等から皆様で調べて頂くようお願いします。
しかし、「あくまで単体テスト」という前提は必ず頭の隅に置いておくようにしてください。
これがないと思わぬ落とし穴にはまって時間がかかってしまうことがあります。
私と同じ失敗を繰り返す人が、この記事でも一人でも減らせることを願い、今回の記事はここまでと致します。
貴重なお時間で読んでくださってありがとうございました。
参考文献
Mockitoの使い方 - Qiita
mockを使おう! - Qiita
【Java】Mockitoの飲み方(入門) - CCT-recruit
JUnitでMockitoを利用して処理の一部をモック化してみた
Discussion