web-dev-qa-db-ja.com

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

私はこれで十分にプレイしておらず、通常はモックを使用していますが、この2つとRhino Mocksでどちらを使用するかとの違いは何でしょうか。

更新:

また、私の質問に対する答えは Ayendeの言葉 で見つけました。

スタブとモックの違い

この記事でこれらの用語の実際の定義を取得できます: Mocks Are n't Stubs 。 Rhino Mocksの観点からの違いに焦点を当てたいと思います。

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

テスト対象のコードの動作を検証する場合は、適切な期待値でモックを使用し、検証します。特定の方法で動作する必要があるかもしれないが、このテストの焦点では​​ない値を単に渡したい場合は、スタブを使用します。

重要:スタブによってテストが失敗することはありません。

148
Rismo

this に従って

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

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

一方、スタブには別の目的があります。期待を記録または検証するのではなく、テストシナリオを利用するために「偽」オブジェクトの状態を「置換」することができます。

146
nzpcmad

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

スタブ

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

モック

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

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

総括する

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

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

スマイルとメタファーの違いのように、スタブとモックの違いは微妙で歴史的であり、おそらく技術的な大きな違いよりもテスト世界のさまざまなコミュニティや哲学に関係しているのでしょう。

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

どちらを使うべきですか?

スタブの作成を開始することに気付く場合がありますが、後でオブジェクトの一部に対してフルモックを作成する必要がある場合があります。移動中にすべてをモックしたい場合もあれば、必要な場所だけをモックしたい場合もあります。

20
superluminary

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

7

Moqフレームワークの場合-セットアップメソッドはSTUBで、VerifyメソッドはMockである

5
codebased

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

0
Sean