0

単体テストでは、データ層をモックするか、ダービーのような組み込みデータベースを使用する方が良いですか?

テストの目的にもよることは承知しています。しかしダービーを使えば、すべてのオブジェクトをモックする必要はなく、その方が簡単だと思います。一方、それは統合テストに向けられていることを理解しています。では、単体テストではどちらがより一般的でしょうか?

ありがとう。

コメントに従って更新します。

だから私は今ダービーを設定しましたが、私のマネージャーはeasymockの使用を主張しています. 私たちはjpaを使用しており、約20のテーブル=>データモデルがあります。それでは、プロジェクト モデルのような各メソッドに対して、そのすべてのメソッドに対して mockedProject の戻り値の型を指定する必要がありますか? getProjectName()、getProjectId() などですか? また、永続マネージャー オブジェクトをモックする必要があります。derby のような埋め込みデータベースを構成するだけの場合と比較すると、これはかなりの量だと思いました。

4

3 に答える 3

3

まず、単体テスト(データベース、ファイルシステムなど)で外部コンポーネントを使用する場合、それらは単体テストとは呼ばれなくなり、代わりに統合テストと呼ばれるようになります。

一方、古典的なモックはスタブではないことを引用すると、次のようになります。

  • のオブジェクトには実際に機能する実装がありますが、通常はショートカットを使用するため、本番環境には適していません(インメモリデータベースが良い例です)。

そして、ユニットテストで偽物を使用することに何の問題もありません。

のような高速でシンプルなインメモリデータベースを使用することをお勧めします。、、、 ...をあざけるDataSourceのは苦痛の価値がありません。ConnectionResultSetPreparedStatement

も参照してください

于 2012-07-18T21:39:55.500 に答える
2

単体テストでは、データレイヤーをモックすることをお勧めします。これにより、データレイヤーの機能をテストしていないことが明確になり、単体テストの速度も向上します。

統合テストを行うときは、ライブデータベースをデータレイヤーに接続する必要があります。後で新しいエラーが発生するリスクを制限するために、本番環境で使用されているものと同じタイプのデータベースを使用することをお勧めします。また、各テストに独自のテストデータを作成させ、その後に削除することをお勧めします。これにより、各テストが他のテストケースのテストデータとの相互作用の影響を受けないようになります。

于 2012-07-18T21:36:40.580 に答える
1

JPA を使用している場合は、Project オブジェクトをモックする必要はありません。なぜなら、それらはおそらくただの POJO に過ぎないからです。モックする必要があるのは、永続化マネージャー オブジェクト (EntityManager) だけです。最も単純なケース (「niceMock」で Mockito または Easymock を使用している場合) では、モックを作成して注入するだけで十分です。何をテストするかによって、おそらくそれ以上のことをしたいでしょう: saveorメソッドが呼び出されていることを確認したり、呼び出しでmerge特定の Project オブジェクトを返すように指定したりします。get

EntityManager のモックには、いくつかの利点があります。

  1. 非常に高速に実行され、組み込みデータベースよりもはるかに高速です。これらのテストは何度も実行されるため、負荷がかかりすぎないようにすることが重要です。
  2. 実際のデータベースにデータを入力する必要はありません。いくつかの統合テストではとにかくそれを行う必要があるかもしれませんが、必要なすべてのシナリオをカバーするデータベースを考え出すのは困難です。モックを使用すると、テスト自体で必要な特定のシナリオを作成できます。
  3. IO エラーや、データベースに既に存在するがいくつかの制約に違反しているデータなど、実際には発生させるのが非常に難しい特定の条件をテストしたい場合があります。モッキングでは、メソッドが呼び出されたときに例外をスローするようにモックに指示するだけです。実際のデータベースに接続することは (たとえ埋め込まれていても)、それを実現することは (不可能ではないにしても) 非常に困難です。

POJO をモックしても、これらのメリットはありません。POJO のコードを実行するのは、モック化された POJO と同じくらい高速です。POJO の設定は少し面倒ですが、モック POJO の動作を設定するほどではありません。また、POJO には (通常) 外部依存関係があまりないため、3 番目の利点が必要になることはめったにありません。

于 2012-07-18T23:06:29.210 に答える