確かに、モックは、データベースや Web サービスなどの外部データ ソースをシミュレートするために使用することを目的としています。しかし、より細かいスケールでは、疎結合コードを設計している場合は、「外部システム」である可能性があるものについて、コード全体にほぼ任意に線を引くことができます。私が現在取り組んでいるプロジェクトを取り上げます。
誰かがチェックインを試みると、CheckInUiはCheckInInfoオブジェクトをCheckInMediatorオブジェクトに送信し、CheckInValidatorを使用してそれを検証し、問題がなければ、 CheckInInfoAdapterを使用してTransactionという名前のドメイン オブジェクトに CheckInInfo を入力し、そのTransactionをITransactionDaoのインスタンスに渡します。永続化のための.SaveTransaction()。
私は現在、いくつかの自動化された統合テストを書いています。明らかに、CheckInUiとITransactionDaoは外部システムへのウィンドウであり、モックする必要があります。しかし、ある時点でCheckInValidatorが Web サービスを呼び出さなくなると誰が言えるでしょうか? そのため、単体テストを作成するときに、クラスの特定の機能以外はすべて外部システムであると想定します。したがって、CheckInMediatorの単体テストでは、対話するすべてのオブジェクトをモックアウトします。
編集: Gishu は技術的に正しいです。すべてをモックする必要はありません。たとえば、CheckInInfoは単にデータのコンテナーであるため、モックしません。ただし、外部サービスとして表示される可能性のあるもの (および、データを変換したり、副作用を持つほとんどすべてのもの) はモックする必要があります。
私が好きな類推は、適切に疎結合された設計を、その周りに立ってキャッチゲームをしている人々のフィールドと考えることです。誰かがボールを渡されたとき、彼は次の人にまったく異なるボールを投げたり、別の人に連続して複数のボールを投げたり、ボールを投げてボールを受け取ってから別の人に投げたりすることさえあります. 不思議なゲームです。
コーチおよびマネージャーとして、チームの練習 (統合テスト) を行うためにチーム全体がどのように機能するかを確認したいのはもちろんですが、バックストップとボール ピッチング マシンに対して各プレーヤーが個別に練習することも必要です (ユニット テスト)。モック)。この写真に欠けている唯一の部分は、モックの期待です。そのため、ボールが当たったときにバックストップを汚すように、ボールに黒いタールを塗っています。各バックストップには、その人が狙っている「ターゲットエリア」があり、練習走行の終わりにターゲットエリア内に黒いマークがない場合は、何かが間違っていて、その人がテクニックを調整する必要があることがわかります.
本当に時間をかけて正しく学習してください。Mocks を理解した日は、本当に驚きの瞬間でした。コントロール コンテナーの反転と組み合わせると、もう後戻りできません。
余談ですが、IT 担当者の 1 人がやってきて、無料のラップトップをくれました。