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

IT

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

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

スポンサーリンク

336×280




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

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

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

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

今回はユニットテストを行う際に一部のクラスをモック化するためのライブラリ「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でモック化するのであれば、覚えていて損はないライブラリなので、皆さんもぜひ試してみてください♪

336×280




336×280




CATEGORIES & TAGS

IT, , , , , , , , , ,

blogenist

Author: blogenist