2013-06-19 13 views
5

JDBC関連のメソッドをテストする最良の方法は何ですか?など、ユーザーの禁止、ユーザーの追加などJUnitでのJDBCクエリのテスト

(使用JUnitの)

、私はブール値にすべての私のボイドのメソッドを設定し、彼らが働いてきた場合、彼らはしなかった場合は、それらがfalse、trueを返している必要がありますし、 JUnitテストでこれらの値をアサートしますか?

これはベストプラクティスを見つけるための一般的な質問です。

ありがとうございました!

+0

一般的に私は、これが統合テストの領域であることをアドバイスします。通常のデータベースの代わりにH2などのインメモリ・データベースを使用し、DAOメソッドをコールした後に表に予期した行が含まれていることを確認します。 –

答えて

7

私は個人的にこれについて素晴らしいツールが見つかるMockitoです。 JDBCのリターンがあなたに与えてくれるものを模倣することができるので、特定のクエリとパラメータを指定すれば、特定の値を返すことができます。

単体テストで動作するようにコードを変更する必要はありません。本番とテストの両方で同じように動作するはずです。

また、Derbyなどのメモリ内データベースを使用してテストフェーズの開始時に値をロードすることで、その中に存在する値を知ることもできます。モーキングはおそらく実行時間の面では高速でしょう。

+0

よろしくお願いします。 – user2297666

+0

これを行うと、データベースコードはテストされません。実際のDBコード自体ではなく、データベースコードに依存するすべてのものをテストします。それはあなたがしたいことですか? – DaveH

1

ユニットテストでデータベースにアクセスすることは、一般的にはお勧めできません。私は、データベース接続を模擬し、正しいクエリが呼び出されているかどうかを確認するほうがよいでしょう。原因は、データベースが変更され、クエリがそれ以上機能しない場合は含まれませんが、通常はほとんど発生しません。

1

非常に単純なCRUDメソッドは単体テストでテストする必要はないと思います。メソッドを実行して、テーブルを確認してください。 最も複雑なテストは基本的なCRUD操作をカバーします。

しかし、私はすでに、Create/Find操作が統合テストのような1つの方法でテストされているコードを読んでいます。 findの結果は、作成要求と比較されます。

編集:私は私が(むしろ、インメモリデータベースより)に対して実行される実際のデータベースに接続し、このようなテストを書くときあなたはまた、DB Unit

2

で見ることができます。私のコードの多くは、ストアドプロシージャや他のデータベース特有の機能を使用していますが、Derbyなどで必ずしもサポートされているわけではありません。

これはユニットテストでも統合テストでもわかりません。しかし、それらは重要なです。そのため、私はそれらをContinuous Integrationサイクルに組み込むことを好みます。

永続データベースを使用している場合は、心配することがいくつかあります。テストを実行する前にデータの状態を知る必要があります。テストが実行されるたびに、既知の状態に戻すためにできることはすべて実行する必要があります。これをしないと、テストはお互いに独立したものにならず、スイートの後半にあるテストが、以前のテストの失敗のために失敗し始めるのを発見し始めるでしょう。