Java/Spring初心者による、Spring初心者のためのブログ

エンジニア歴1年未満の初心者による学習ブログ。自分も初心者だからこそ初心者目線で書き綴っています。

【初級~中級】【JUnitテスト】Mockを使いこなそう

モックとは何か(基本)と、

モックを使いたい人全員に伝えたい、JUnit5で使用する時の重大な注意点を記しておきます。 基本は分かってるぜ!って方は「さいごに」だけ読んでください。PowerMockのバージョンについての注意事項を書いています。

 

 

Mock(モック)とは(基本)

(基本なので、ご存知の方は読み飛ばしてください) 

Javaは様々なクラス、コンポーネントで構成されます。 コンポーネントを分けることで、様々な機能を汎用的に利用することが出来るから。 でもコンポーネントを分けたことで、テストをするときに、ある問題が出てきます。

例えば…

クラスAをテストしたい! でもクラスAは、複雑な処理をするクラスBとクラスC、まだ実装途中のクラスDを呼び出す処理を持つ、といった場合。(けっこうよくある事象です) クラスAのテストがメインのはずなのに、なぜかクラスDの実装を待ち、更にクラスB、Cの複雑な処理を再現。ようやくクラスAのテストができる!と、テスト毎に繰り返していくのは大変です。

f:id:to_education:20190618222607p:plain

 

そこで、Mock(モック)やStub(スタブ)、Spy(スパイ)といった考え方が出てきます。

モック、スタブ、スパイは異なるものですが、ざっくり言うと、3つとも、テスト対象クラスから呼ばれるオブジェクトの処理の代わりに、必要な返却値だけをテスト対象クラスに提供してくれる便利なツールです。(3者の詳しい違いを知りたい方はググってください。気が向いたら記事にします)

今回はこのうち、モックに焦点を当てていきます。

 

モックとは、あるクラスのメソッドが呼ばれたときの返却値を予め決めておくことで、そのメソッドの処理をいちいち再現せずに、テストしたいクラスのテストを可能にしてくれる仕組みです。

ClassAをテストする時に、ClassBのXXXメソッドを呼んだら、その瞬間にxxという値を自動的に返す(XXXメソッドの処理を実行するのではない)というかんじ。

f:id:to_education:20190618225558p:plain

こうすることで、クラスA のテストをするときに、いちいち他のクラスの処理を律儀にやらなくて済みます。

 

モック関連のライブラリ

モックの役割やその利便性はご理解いただけたでしょうか。

javaでは、モックを作るために便利なライブラリがそろっています。 代表的なのは以下4つ。

  • Mockito(多分これが一番ノーマル)
  • easy-Mock(Mockitoの前からあった?もの)
  • PowerMock(Mockitoが進化したっぽいやつ)
  • jMockito(一応ノーマルだがバージョンによる機能変化が激しいため、個人的にはお勧めしない)

各ライブラリの使い方や違いなどは別の記事で書きます。

なお、どれか1種類だけを使ったり、全部使ったりすることはあまりなく、 用途に応じて2種類くらいを使い分けることが多いみたいです。

 

さいごに(重要なこと)

こちらは初心者さんというより、モックを使おうという方全員向けのお話です。

 

Mockitoは、JUnit4, 5ともに使えます。PowerMockも、JUnit4、5とも使えます。

が、JUnit5は、PowerMockの代表的な使い道である、private・static・finalメソッド等のモック化には対応していません。その他の一部の機能だけ対応しているようです。

(2019年6月現在の話です。ちなみにJUnit4では使えます。)

 

私はこれになかなか気づかず、JUnit5×PowerMockでどうにかテストしようと丸2日費やしました…orz(それにしても本当に何のためのPowerMockなのか(#^ω^))

 

そのためテストでは、使用しているJUnitのバージョンを必ず確認するようにしてください。(テストに限らずライブラリ使用時は確認すべきですが特に!)

 

それでは次回以降の記事で、具体的にMockitoなどの使い方を説明していきます('ω')