モックオブジェクトはいつ使用する必要がありますか?


14

TDDについて多くのことを読みましたが、まだ疑問があります。たとえば、次のクラス図があります。

ここに画像の説明を入力してください

これは、TDDとモックオブジェクトについて学ぶための簡単な例です。

どのテストを最初に書くべきですか?製品、次にライン、最後に注文?その場合、ライン製品を使用して注文をテストする必要がありますか、またはモックオブジェクトを使用する必要がありますか?モックオブジェクトはいつ使用する必要がありますか?XPおよびTDDでUMLを使用する必要がありますか?

私はまだこれらのものを得ていません。

回答:


10

図から判断すると、Productはテストする機能を持たない愚かなデータクラスです。そこで、最初にLine、次にOrderのテスト(および実装、TDDスタイル)を作成して、依存関係のラダーを作成します。通常、上位レベルのクラス(下位レベルに依存するクラス)で作業を開始する前に、下位レベルのクラスをテストするのが賢明です。これにより、バグをより効率的にキャッチできます。

モックオブジェクトを使用する必要があるかどうかは、テスト対象のクラスの実際の依存関係によって異なります。これらが、テストに必要な任意のデータ/状態を簡単にインスタンス化しセットアップできる単純なクラスである場合、モックは必要ありません。(これは、ここでのサンプルデザインの場合のようです。)ただし、依存関係のいずれかを初期化するのが困難である/広範な依存関係自体がある/望ましくない副作用がある/ DBなどの外部リソースに依存する場合、それは理にかなっています代わりにモックオブジェクトを使用します。


前にも言ったように、TDDとMockオブジェクトについて学ぶための単純なシナリオでした...すばらしい答えです、ありがとう。そして、UMLはどうですか?避けるべきですか?

@ thomas、UMLを避ける必要はありません。TDDと競合しません。UMLは、設計の問題を視覚化/伝達するのに非常に適しています。これは、特定の開発段階で非常に役立ちます。ただし、設計は進化し、美しく詳細なUMLシステム図をコードと同期させようとすると、すぐに負担になります。不要になった場合は忘れずに捨ててください:-)
ペテルトーレック

1
@thomas、ここでの規則は、答えの横にある上向き矢印をクリックして、役に立つと思う答えを投票することです:
ペテル・トレック

4

ここでは、モックオブジェクトの必要性はあまりありません。他の人が指摘したように、依存関係を設定するのが難しい場合はほとんど必要になります。

たとえば、コントローラーをテストし、別のコントローラーを呼び出してその情報の一部をCookieに保存する必要があるユーザーログインが必要なときに、Ruby on Railsプロジェクトでそれらを使用しました。この場合、特定のアクセス権限について尋ねられたときにtrueを返すログインユーザーをモックすると便利です。


2

通常、テストでは、テスト対象のシステム/オブジェクトを分離する必要があるため、それ以外のものはモックします。したがって、クラス図を使用して、注文オブジェクトをテストするときに、ラインオブジェクトにモックを使用します。Lineをテストするときは、OrderおよびProductのモックを使用します。製品をテストするときは、Lineのモックを使用します。


ProductはLineに依存しないため、Lineでモックを使用する必要はありません(また、方法もありません)。LineとOrderについても同じです。
ペテルトレック

2

「TDDは主に、ソースコードが徹底的にユニットテストされることを保証するという副作用を伴う設計手法です」-Scott W. Ambler

アイデアは、単体テストを作成して設計を見つけることです。あなたの場合、すでにデザインが整っているようで、TDDの目的をやや損ねています(デザインが最終的なものであると仮定します)。

ock笑について。モックを作成する場合は、Lineのテストを作成するときにProductをモックし、OrderをテストするときにLineをモックすることをお勧めします。しかし、ここではやり過ぎかもしれません。私は個人的に可能な限りモックを制限し、それを使用して外部クラス(データベースインスタンスなど)への依存関係を分離します。


2
私は単純なクラス図を持っています...

-1では、設計について考えると(クラス図の落書きを含む)、TDDを実行できなくなりますか?それは単に間違っているように聞こえます。
Bjarkeフロイント・ハンセン

1
@bjarkef:もう一度私の答えを読んでください。設計が最終的なものである場合、TDDを実際に使用して設計を実行することはできません。これがTDDの目的です。そして、これもOPを混乱させるものだと思います。彼はすでに解決策を持っているので、現在、そのためのテストを作成しようとしています。「どのテストを最初に書くべきか、製品または注文」。最初にテストを作成する場合、その質問は実際には関係ありません。
マーティンウィックマン

テストや製品コードなしで設計が最終的なものであることをどのように判断しますか 動作するものを作成すると仮定します。
-JeffO

@ジェフ:明らかにできません。それはTDDがあなたを助けることができる一つのことです。
マーティンウィックマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.