モックとは何ですか?いつ使用しますか?
質問
モックオブジェクトに関するウィキペディアの記事を読んだばかりですが、まだ完全にはわかりませんその目的で。実際のオブジェクトが複雑すぎたり、予測不可能な場合に、テストフレームワークによって作成されたオブジェクトのように見えます(モックオブジェクトの値が完全に制御されているため、モックオブジェクトの値は100%確実です)。
ただし、すべてのテストは既知の値のオブジェクトを使用して行われるという印象を受けていたため、何かが欠けているに違いありません。たとえば、コースプロジェクトでは、カレンダーアプリケーションを使用しました。テストスイートは、複数のイベントオブジェクト、さまざまなサブシステム、ユーザーインターフェイス間の相互作用をテストできるように、それらが何であるかを正確に知っているイベントオブジェクトで構成されていました。これらは模擬オブジェクトであると推測していますが、既知の値のオブジェクトがないとシステムをテストできないため、なぜそうしないのかわかりません。
解決
モックオブジェクトは、既知の値を持つオブジェクトだけではありません。これは、テストで使用できない複雑なオブジェクト(データベース接続や結果セットなど)と同じインターフェースを持つオブジェクトですが、テストで制御できる実装を備えています。
これらのオブジェクトをオンザフライで作成できるモックフレームワークがあり、本質的には次のようなことを言うことができます。 0を渡すと、trueが返されます。その後、foo()を使用するコードをテストして、適切に反応することを確認できます。
Martin Fowlerのモッキングに関する素晴らしい記事があります:
他のヒント
クライアントとサーバーのソフトウェアを使用する古典的なケースを考えてください。クライアントをテストするには、サーバーが必要です。サーバーをテストするには、クライアントが必要です。これにより、モックを使用せずに単体テストを行うことはほとんど不可能になります。サーバーをモックする場合は、クライアントを分離してテストできます。逆も同様です。
モックのポイントは、モックするものの動作を複製しないことです。状態の変化をテストフレームワークで分析できる単純な状態マシンとして動作することです。そのため、クライアントモックはテストデータを生成し、サーバーに送信してから応答を分析します。特定の要求に対する特定の応答を期待しているので、受け取ったかどうかをテストできます。
すべてに同意します @Lou Franco と言うので、@ Lou Francoが指摘しているテストダブルスに関するMartin Fowlerの優れた記事を必ずお読みください。
テストダブル(フェイク、スタブ、またはモック)の主な目的は、単体テストがそのオブジェクトのみをテストするようにテスト中のオブジェクトを分離することです(その依存関係およびコラボレーションまたは相互作用する他のタイプではありません)。
オブジェクトが依存しているインターフェイスを提供するオブジェクトを実際の依存関係の代わりに使用して、特定の相互作用が発生することを期待できます。これは便利な場合もありますが、状態ベースのテストと対話ベースのテストについては論争があります。モックの期待値を使いすぎると、脆弱なテストになります。
テストダブルのもう1つの理由は、データベースやファイルシステム、またはセットアップや時間のかかる操作の実行にコストがかかる他のタイプへの依存関係を削除することです。これは、関心のあるオブジェクトの単体テストに必要な時間を最小限に抑えることができることを意味します。
例を次に示します。データベースにデータを入力するコードを作成している場合、特定のメソッドがデータベースにデータを追加したかどうかを確認できます。
テスト用にデータベースのコピーを設定すると、テストされたメソッドの呼び出しの前にレコードがなく、その後に1つのレコードがあると仮定すると、データベースを以前の状態にロールバックする必要があるという問題があります。テストを実行するためのオーバーヘッドに。
以前よりもレコードが1つしかないと仮定すると、同じデータベースに接続する2番目のテスター(または同じコード内の2番目のテスト)と衝突し、依存関係を引き起こしてテストを脆弱にする可能性があります。
モックを使用すると、テストを互いに独立した状態に保ち、簡単にセットアップできます。
これは一例です-他の人がもっと供給できると確信しています。
このトピックに関する他の貢献者、特にMartin Fowlerの記事への推奨に100%同意します。
この本に興味があるかもしれません。 http://www.growing-objectをご覧ください。 -oriented-software.com/ 。 Javaにありますが、アイデアはまだ適用されます。