-
– ロールをモックせよ p.41.3 オブジェクト指向プログラムのテスト駆動開発
あるオブジェクトの外部とのインタラクションに集中すると、サービスを 1 つ呼び出し、その結果隣接オブジェクトとどうインタラクションしているかを追跡することでテストできるようになる。テストファーストでプログラミングしている場合、これらのテストを外向性インターフェイス(まだ存在していないかもしれない)の観点から定義できるようになる。それが、あるアクションが成功したかどうかを確かめる手段になるからだ。
たとえば、dog.expressHappiness() が成功したら、dog の実装が body.wagTail() を呼び出すと決めよう。これは dog オブジェクトを開発するときに行う設計上の判断で、サービスの実装方法に関するものだ(ここでも、body(胴体)に対して tail(尻尾)の実装を訊ねないようにすることで列車事故を防いでいることがわかるだろう)。
もし、DogBody オブジェクトがまだ wagTail() メソッドを実装していなければ、このテストによって満たすべき新しい要件が識別されたことになる。ここで手を止めて新しいフィーチャの実装を始めたくはない。それでは現在の作業から気が逸れてしまうし、wagTail() を実装しようとしてもその先の実装が長く続いていって、いつ終わるかわからなくなってしまうと思われるからだ。
その代わり、我々は DogBody オブジェクトの偽の実装を提供し、メソッドが実装されているフリをしてもらう。そうすれば、その偽のオブジェクトに仕掛けをして、expressHappiness() をテストしている間に wagTail() が実際に呼び出されたかどうかを確かめられるのだ。
要約すればこうなる。我々はオブジェクトをテストする際に隣接オブジェクトを偽物と置き換える。そしてその偽物が、期待通りに呼び出されたことを検証し、呼び出し元が求めるふるまいをすべてスタブ化するのだ。この偽物がモックオブジェクトと呼ばれる。そして、モックオブジェクトを使った TDD のテクニックも、モックオブジェクトと呼ばれるのだ。