「モック」と「スタブ」

f:id:utouto97:20210725220655j:plain

テストを書く上で、「モック」と「スタブ」といったものを利用します。
「モック」と「スタブ」についてまとめます。

「モック」とは

ここでは、テストしたい対象オブジェクトをオブジェクトAとします。
そして、オブジェクトAはオブジェクトBを持っています。
オブジェクトBはメソッドfを持ちます。

テスト対象はオブジェクトAです。
そして、オブジェクトAではオブジェクトBのメソッドfを呼び出しているとします。

このとき、オブジェクトBのメソッドfの挙動をテストする必要はありません。
なぜなら、この場合のテスト対象は「オブジェクトA」であるからです。

ここでは、オブジェクトAがどのようにオブジェクトBを利用したか、によってオブジェクトAを検証します。
つまり、オブジェクトAの中でオブジェクトBのメソッドfを呼び出しているが、その結果は重要ではなく、 オブジェクトBのメソッドfが呼び出された回数やどのような引数で呼び出されたかを検証する必要があります。

しかし、もちろんオブジェクトBにそのような機能はありません。
そこで、「モック」の出番です。
モックオブジェクトは、この場合のオブジェクトBに代わります。
そして、メソッドfが呼び出された回数やどのような引数で呼び出されたかを検証します。

つまり、「モック」とはテスト対象のオブジェクトが内部で利用しているオブジェクトの代わりとなり、検証を行うものです。
テスト対象のオブジェクトAがオブジェクトBにどのように作用するか、を検証します。

「スタブ」とは

「モック」の話は一度忘れて、頭をリセットします。

ここでは、テストしたい対象オブジェクトをオブジェクトAとします。
テスト対象はオブジェクトAです。
そして、テスト中で使われているメソッドgがあるとします。

このとき、メソッドgの挙動をテストする必要はありません。
なぜなら、この場合のテスト対象は「オブジェクトA」であるからです。

ここでは、オブジェクトAがメソッドgの結果を利用しているとします。
つまり、オブジェクトAのテストができるように、メソッドgの返り値を操作する必要があります。

そこで、「スタブ」の出番です。
スタブメソッドは、この場合のメソッドgに代わります。
そして、メソッドgが呼び出されるとあらかじめ決められた値を返します。

つまり、「スタブ」とはテスト中で利用しているメソッドの代わりとなり、データを提供するものです。
テスト対象のオブジェクトAがメソッドgからどのようなデータを受け取るか、をコントロールします。

終わり