プログラミング Java

【図解】Mockito – mock と spy の違いは?

投稿日:2022年3月8日 更新日:

テストコードでモックを書くときによく使うMockitoですが、mock()とspy()の違いについてよくわからないという方向けに図解で解説します。

図解

mock()

・全てのメソッドが一旦使用不可になる。
・doReturnなどで戻り値を定義したメソッドだけ利用可能
 (上図ではgetB()のみが使用可能な状態です)

spy()

・全てのメソッドはそのままで実行可能です。
・doReturnなどで戻り値を定義したメソッドだけ戻り値が上書きされます。
 (上図ではgetB()のみが変更した値を返すようになります)
 

コード

 
Hoge.java(テスト対象)

HogeTest.java(テストコード)

testMockCase

・getA()とgetC()はnullを返すのでコメントアウトしています。
・getB()はdoReturnで指定した戻り値でテストが通ります。

testSpyCase

・getA()とgetC()はHoge.javaで定義されている元々の値を返します。
・getB()はdoReturnで指定した戻り値でテストが通ります。

 

使い分け

mockは特定の値を返してほしいときに使います。

spyは一部の振る舞いを変えたうえで他のクラスに食わせて、意図した振る舞いをさせるときに使います。
例えば、Hoge.javaを持つことになる別のクラスに渡すとき、getB()の戻り値がNULLであることを期待するといった場合です。

まとめ

・mockは全て使えない状態にして、指定したメソッドだけ定義通りの振る舞いにする。
・spyは全て使える状態から、指定したメソッドだけ意図した別の振る舞いをさせる。

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

【JPA】リレーションの無いエンティティをJPQLで結合する

概要 @ManyToOneや@OneToManyといったリレーションをエンティティに設定していないまたは設定できない状況にあるが、結合した結果を取得したいという状況を想定しています。 方法としては「J …

CSV/TSVデータを作成するVBAツールを公開

【追記:2020年8月1日】 UTF-8(BOM無し)に対応しました。 業務でテスト用のCSVファイルを作成することがよくあるので、自分でツールを作成しました。 TSVにも対応しています。 基本仕様 …

【SpringSecurity】#3~ 独自のログイン画面

概要 オリジナルのログイン画面を実装する方法です。 以下の内容になっています。 ログイン用のHTMLを用意する。 Controllerにログインの遷移先を定義する。 SecurityConfigクラス …

Jacksonで日付がずれる場合、Timezone設定を直す

現象 JacksonでCSV出力する際、日付がズレて出力される。   原因 タイムゾーンの設定がTokyo/Asiaになっていない。   対策 application.proper …

【Java】オブジェクト指向の練習題材(成績オブジェクト)

前回記事、オブジェクト指向とは何なのかを簡単に説明してみるの練習題材です。 ここでは2つのオブジェクトを作成していきます。 成績オブジェクト:教科と点数などを保持 生徒オブジェクト:氏名と成績を保持 …

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。