Rhino Mocksのモックとスタブの違いは何ですか?


149

私はこれで十分に遊んでいないため、通常モックを使用しますが、この2つとRhino Mocksでどちらか一方をいつ使用するかにはどのような違いがあるのでしょうか。

更新:

私の質問への答えもアイエンデの言葉で見つかりました:

スタブとモックの違い

この記事でこれらの用語の実際の定義を理解できます。モックはスタブではありません。Rhino Mocksの視点からの違いに焦点を当てたいと思います。

モックは、期待を設定できるオブジェクトであり、期待されるアクションが実際に発生したことを確認します。スタブは、テスト対象のコードに渡すために使用するオブジェクトです。期待値を設定できるため、特定の方法で動作しますが、それらの期待値は検証されません。スタブのプロパティは自動的に通常のプロパティのように動作し、それらに期待を設定することはできません。

テスト中のコードの動作を確認したい場合は、適切な期待でモックを使用し、それを確認します。特定の方法で動作する必要があるが、このテストの焦点では​​ない値を渡すだけの場合は、スタブを使用します。

重要:スタブが原因でテストが失敗することはありません。


回答:


148

あたりとして、この

...簡単に言えば、MockオブジェクトとStubオブジェクトには違いがあり、RhinoMocksは、目的をより明確に示すテストを記述できることを認識しています。

モックオブジェクトは、期待を定義するために使用されます。つまり、このシナリオでは、メソッドA()がそのようなパラメーターで呼び出されることを期待しています。モックはそのような期待を記録して検証します。

一方、スタブには別の目的があります。それらは期待を記録または検証せず、テストシナリオを利用するために、動作、「偽の」オブジェクトの状態を「置き換える」ことを可能にします...


この質問の受け入れられた回答と同じメッセージをエコーする別の便利な投稿を見つけました-martinfowler.com/articles/mocksArentStubs.html
singh1469

20

一般的に言えば、ユニットテストは関数とメソッドを呼び出し、期待される動作が行われたかどうかを確認します。これらの関数とメソッドにはパラメーターが必要な場合があります。これらのパラメーターを満たすために、スタブとモックを使用します。グローバルオブジェクトをモックすることもあります。

スタブ

スタブは、テストがパラメーターとして使用して関数呼び出しを機能させることができる小さな偽のオブジェクトです。これにより、テスト中の関数の動作を確認できます。スタブには実装がないため、副作用を確認できません。

モック

モックは実装を備えたスタブです。テスト対象の関数がモックオブジェクトと相互作用する場合、モックが期待どおりに相互作用したことを確認できます。

たとえば、模擬のUserオブジェクトがあり、session.loginメソッドが機能していることを確認したい場合、user.lastLoggedInが設定されていることを確認したいとします。このメソッドを実装する模擬ユーザーを作成できます。session.loginを呼び出すと、user.lastLoggedInが予期した状態であることをアサートできます。

総括する

モックとは、副作用をテストできる実装を備えたスタブです。

この違いはまだ重要ですか?

類義語と比喩の違いのように、スタブとモックの違いは微妙で歴史的であり、おそらくテストの世界のさまざまなコミュニティや哲学と、主な技術的な違いよりも多くのことをしているのです。

これらは、テストに対するわずかに異なるアプローチを表しています。モックはスタブのように書くことができます。通常、スタブはモックに拡張できます。

あなたはどちらを使うべきですか?

スタブの作成を開始し、その後、一部のオブジェクトのモックを完全に作成する必要があることに気付く場合があります。必要に応じて、すべてをモックしたり、モックしたい場合があります。


7

モックとスタブの違い:スタブでは、ユニットテストの入力を修正します。そのため、ユニットテストは、偽のオブジェクトの動作を修正するいくつかのメソッドの実装を書き換えて、スタブおよびスタブに対してアサーションを作成しません。Mockでは、ユニットテストの出力を修正します。ユニットテストでは、モックオブジェクトの内部の相互作用をチェックすることで、モッキングオブジェクトを期待します。


テストはモックの出力を「チェック」する必要があると言っているようです。それがあなたが言っていることなら、あなたは間違っています。モックをテストすることは想定されていません。そこにあるので、他のコードをテストできます。それともあなたの最後の文は何か他のものを意味しますか?
Andrew Barber

1
こんにちはアンドリュー、私がモックで書いたように、テストの出力を修正してテストしないようにします。それ以外の場合は、モックを使用して相互作用を確認できるようにしました(期待動作... ;-)
Hassan Boutougha

1
OK、それはもっと理にかなっています。説明をありがとう!
Andrew Barber

>スタブでアサーションを行わない理由なぜ多くのアサーションライブラリにまだパラメーターshould have been called withがアサートされるメソッドが存在するのかstub
hellboy 2015

5

Moqフレームワークの場合-セットアップメソッドはSTUBですが、検証メソッドはモックです。


0

私が気付いたことの1つは、MockRepository.GenerateMockを使用するときに、特定のメソッド呼び出しに期待値を明示的に設定して、その呼び出しをインターセプトする必要があることです。スタブを使用すると、仮想メソッドである限り、どのメソッドも自動的にインターセプトするように見えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.