素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

投稿日: 2020年8月21日
最終更新日:

【JUnit】Java製のユニットテスト向けフレームワーク「Mockito」でMockとSpyを使いこなそう【簡単スタブ化】

YouTubeも見てね♪

ねこじゃすり

created by Rinker
PEPPY(ペピイ)
¥3,850 (2024/04/03 21:33:13時点 Amazon調べ-詳細)

猫を魅了する魔法の装備品!

[ノースフェイス] THE NORTH FACE メンズ アウター マウンテンライトジャケット

created by Rinker
THE NORTH FACE(ザノースフェイス)
¥33,430 (2024/04/03 21:42:09時点 Amazon調べ-詳細)

防水暴風で耐久性抜群なので旅行で大活躍です!

ペヤング ソースやきそば 120g×18個

created by Rinker
ペヤング
¥2,600 (2024/04/03 21:42:16時点 Amazon調べ-詳細)

とりあえず保存食として買っておけば間違いなし!

レッドブル エナジードリンク 250ml×24本

created by Rinker
Red Bull(レッドブル)
¥4,000 (2024/04/03 21:42:12時点 Amazon調べ-詳細)

翼を授けよう!

モンスターエナジー 355ml×24本 [エナジードリンク]

created by Rinker
モンスター
¥4,748 (2024/04/03 21:33:15時点 Amazon調べ-詳細)

脳を活性化させるにはこれ!

ドラゴンクエスト メタリックモンスターズギャラリー メタルキング

created by Rinker
スクウェア・エニックス(SQUARE ENIX)
¥3,250 (2024/04/03 21:42:09時点 Amazon調べ-詳細)

みんな大好き経験値の塊をデスクに常備しておこう!

BANDAI SPIRITS ULTIMAGEAR 遊戯王 千年パズル 1/1スケール

created by Rinker
BANDAI SPIRITS(バンダイ スピリッツ)
¥7,500 (2024/04/03 21:42:14時点 Amazon調べ-詳細)

もう一人の僕を呼び覚ませ!!

ユニットテストでモック化してみよう

ユニットテストはなるべく書こう

開発を行う上でユニットテストはとても大切です。

実装と並行してユニットテストを組んでおけば、簡単なテストの自動化や保守性・潜在的バグを洗い出せるので出来る限りやっておきたいですね。

今回はユニットテストを行う際に一部のクラスをモック化するためのライブラリ「Mockito」を使ってみようと思います!

モックとは?

モックという言葉を初めて聞く方もいるかもしれません。

モックとは、クラスの動作を意図的に設定し、擬似的シミュレートするためのオブジェクトの事を指します。

例えば、Service層とRepository層がある場合、Repository層のユニットテストでは実際にDBにアクセスして動作確認を行うテストを記述しますが、Service層のユニットテストを記述する際は、Repositoryクラスの動きはRepository層のユニットテストで担保している前提で行うことが多いので、実際にDBや外部システムへのリクエストは行いたくない場合があると思います。

その際にRepositoryクラスをモック化する事で、実際にはDBや外部システムへのリクエストは発生していないService層からすると実際にデータを取得出来るので問題なくService層のテストを行うことが可能です。

Java製の定番ライブラリ「Mockito」

今回はJunitを使う際にお馴染みのMockitoを使って簡単なモック化の動きについてご紹介しようと思います♪


Tasty mocking framework for unit tests in JavaMockito framework site

使い方

準備

前提

今回は以下の環境で動かします。

環境
  • Gradle 5.6.4
  • OpenJDK 11.0.2
  • Lombok 1.18.12
  • Junit 4.12
  • Mockito 2.28.2

使用クラス

Model層

Repository層

Service層

Gradleに依存関係の追加

まずは今回使用するライブラリをbuild.gradleに追記しましょう。

whenメソッドによるMock作成用のHelperクラスの用意

Mockオブジェクトを生成する方法はstaticメソッドによる生成とアノテーションによる生成の2種類あります。

まずは前者の方法による生成のためのヘルパークラスを用意しました。

このクラスは本質的な部分ではない為簡易的に作っているので、よしなに各自カスタマイズしてください!

Service層のテスト

mock化しない

では、まずはRepository層のfindByメソッドをmock化せずにそのままテストしてみましょう。

こちらは問題なく動いています。

Mock化

では、まずはRepository層のfindByメソッドをmock化してみましょう。

このようにfindByメソッドを呼び出した際の戻り値を呼び出し側でセット可能なので、実際に定義されたPersonRepositoryfindByメソッドは呼ばれないのでDBアクセスや外部APIアクセスを無効化した上でServiceクラスを動かす事が出来ます。

テストも正常に行えていますね♪

mock化した際には戻り値をセットする必要がある

対象クラスをmock化すると、全ての実装済メソッドが内部ロジックを持たないインターフェースのようなメソッドに置き換わっているため、実行時に期待通りの動きをしてくれません。

なので、呼び出すメソッドの戻り値を明示的に指定する必要がある点を気をつけましょう。

Spy化

MockitoにはMock化のほかにSpyという機能もあります。

Spyとは、対象クラスの実装メソッドをそのままにしながら、任意のメソッドのみをMock化することが出来ます。

一部のメソッドはそのままのロジックで動かしつつ一部のメソッドのみ制御したい場合にSpyを使う感じですね。

Spyも正常に動きましたね♪

アノテーションによる生成方法

次にアノテーションを使ったMockオブジェクト及びSpyオブジェクトの生成方法を試してみましょう。

Mockの生成

アノテーションで実装した方がスッキリかつTestケース内でStubの内容がはっきり分かるので良いかもしれませんね!

Mockの生成

Spyも同様に簡単に生成出来ましたね♪

終わりに

以上のようにレイヤー単位でのユニットテストを実装するのであれば、必ず必要となってくるMock化をご紹介しました。

JUnitでモック化するのであれば、覚えていて損はないライブラリなので、皆さんもぜひ試してみてください♪

CATEGORIES & TAGS

IT