uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

「スタブ」と「モック」は全然違うものなんですよ

「スタブ」と「モック」は全然違うものなんですよう、という話は前からされてますが、世の中にたくさんの誤解があふれている。ファウラー氏の記事もわかりにくいわい!!!頭のいい人に解説させてはダメだ!(暴論)。

つーことで上の考え方を私の言葉で述べます。

「スタブ」と「モック」は違います。何が違うかといいますと、目的が違います。何の目的かというと、試験の目的です。

んでね、混乱の原因の一つは「スタブオブジェクト」「モックオブジェクト」という使うモノを見てては、この目的の違いが分からないということです。日本刀とマグロ切り包丁を見ていても、両者が違うことがわからない。目的と照らし合わせてみて始めて違いがわかるんです。

モックについて言うと「オブジェクト間の相互作用を見るためのテスト」をするときに用いるのがモック。以上。それ以上でもそれ以下でもない。便利さの度合いも試験の手軽さもスピードも関係ない(直交する問題)。

例えば、ある「細胞」に対して試験をするとします。このとき:

  • 刺激を与え、その細胞の1個の内部の状態がどう変化するか、を見るのが、状態中心のテスト。酸性度が上がるのか、ミトコンドリアが分裂するのか、など。いわゆる状態中心のテスト、普通のユニットテストです。
  • 刺激を与え、その刺激をきっかけとして、その細胞が他に対してどういう影 響を及ぼすのか、シナプス経由で電気信号を発するのか、化学物質を放出するのかを調べる相互作用の試験。細胞内部には興味ありませんし調べません。モックを用いたテストがこっちです。

モックは後者のためにしか使えないし、モックのあらゆる機能がそのために設計されているのが分かります。

モックを使うかどうかは、どのような試験をしたいのかによって決定されます。試験の範囲が違います。通常ユニットテストはするとするなら、その上で、他のオブジェクトの相互作用について試験をしたいのかどうかです。モックテストは結合試験の領域に一歩近づきます。

もう一個の混乱の原因は「モックという名前」です。モックと名前をつけたやつが根本的に悪い。英語の意味からすると、スタブも「モック(真似するもの)」なのですから混乱するのも当たり前です。さらに、モックの主目的はモックすることではない。まねるのは副作用でしかない(実際、特別なモックオブジェクトを作らずに実オブジェクトに対する呼び出しを検出することもできる。パーシャルモックとも言う)。本来は、スタブの事をモックと呼ぶべきなんです。ではモックをなんて呼ぶべきか?

改名提案しておきます。モックを、「インタラクションディテクター」(相互作用検出用オブジェクト)と呼びましょう。

スタブとは違うのだよスタブとは!!

名前が悪いシリーズ