149

私はこれで十分に遊んでおらず、通常はモックを使用していますが、この 2 つの違いは何なのか、Rhino モックでどちらをいつ使用するのか疑問に思っています。

アップデート:

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

スタブとモックの違い

これらの用語の実際の定義については、記事「モックはスタブではない」を参照してください。Rhino Mocks の観点からの違いに焦点を当てたいと思います。

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

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

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

4

5 に答える 5

20

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

スタブ

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

モック

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

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

総括する

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

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

直喩と隠喩の違いと同様に、スタブとモックの違いは微妙で歴史的なものであり、おそらく、主要な技術的な違いよりも、テストの世界におけるさまざまなコミュニティや哲学に関係しています。

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

どちらを使用する必要がありますか?

スタブの作成から始めて、後で一部のオブジェクトに対して完全なモックを作成する必要があることに気付く場合があります。必要に応じてすべてをモックしたい場合もあれば、必要な場所だけをモックしたい場合もあります。

于 2017-01-05T11:16:17.770 に答える
7

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

于 2012-11-07T19:58:18.767 に答える
5

Moq フレームワークの場合 - setup メソッドは STUB で、Verify メソッドは Mock です

于 2014-09-18T08:22:49.603 に答える
0

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

于 2015-07-07T19:38:56.797 に答える