[PHP] PHPUnitのスタブとモックの違いとは

テスト初心者の自分があちこちのサイトを参考にしながらテストを書いていると、「スタバ」とか「モック」という言葉に頻繁に出くわす。以前PHPUnitの勉強をしたときに見た覚えがあるものの、記憶が怪しいので再勉強。

スタブとモックの違い

PHPUnitのマニュアルでは以下のように説明している。

PHPUnit マニュアル – 第9章 テストダブル
https://phpunit.de/manual/current/ja/test-doubles.html

実際のオブジェクトを置き換えて、 設定した何らかの値を (オプションで) 返すようなテストダブルのことを スタブ といいます。
実際のオブジェクトを置き換えて、 (メソッドがコールされたことなどの) 期待する内容を検証するテストダブルのことを モック といいます。

これではなんとなく解りにくいので、他に説明しているサイトを幾つか探してみる。

RSpec でテストを作るのに役立つ「モック/スタブ」のシンプルな説明 – 酒と泪とRubyとRailsと
http://morizyun.github.io/blog/rspec-model-controller-ruby-rails/

モックとは「「オブジェクトのメソッドがどう呼ばれて何を返すか」というインタフェースも含めたテストのために使う」ものであり、スタブとは「テストをス ムーズに行うために「あるオブジェクトのメソッドが呼ばれたら、ある戻り値を返す」ために使う」ものであるという定義は分かりやすい。

Test DoubleとPHPUnit | akkunchoi@github
http://akkunchoi.github.io/test-double-phpunit.html

特に重要で間違いやすいのが「モック」と「スタブ」だ。英単語では「モック」は模造品、「スタブ」は切り株、切り残しという意味だが、Test Doubleにおいては「モック」は出力の確認、「スタブ」は入力の差し替えを意味する。

言っていることはなんとなく解る気がするんだけど、サイトごとに微妙に違うような気もするな。日本語で明確に定義するのは難しいってことか。

ちなみに僕の見解だとこんな感じ。どうだろ?

  • 「モック」は模擬運用するための模造品
  • 「スタブ」はとりあえず動かすための代用品

サンプルコード付きの参考サイト

モックオブジェクトを利用したテスト – pixiv inside
http://inside.pixiv.net/entry/2014/12/11/192708

PHPUnitのスタブをつかってみた – kitak.blog
http://kitak.hatenablog.jp/entry/2013/11/17/145324