2012-11-14 31 views
7

私はいくつかのレコードを読み込んでデータベースに挿入する簡単なアプリケーションを書いています。私は、挿入ロジックを処理するストアドプロシージャを作成し、それを個別にテストする予定です。今私は、ビジネスオブジェクトをとり、それをストアドプロシージャ呼び出しに渡すロジックの部分について、優れた単体テストを作成したいと考えています。MySQLストアドプロシージャを呼び出すJavaの単体テスト方法は?

私はは私がやりたいことは、その後コールが予想されるパラメータ値で作られていることを主張し、データベース接続のモックを渡すと思い

Connection dbConnection = makeMockConnection(); // how? 
MyObjectWriter writer = new MyObjectWriter(dbConnection); 
writer.write(someSampleObject); 
// somehow assert that dbConnection called 
// `sp_saveMyObject` with param values x, y, and z 

しかし、それは多くの作業のように思えます内部を掘ってjava.sql.Connection、それがどのように動作するのか理解してから、すべての結果をモックしてください。私のためにこれすべてを行うテストライブラリがありますか?私はこれに間違った方法で来ていますか?

+0

メソッドが呼び出されたかどうかを確認するために接続を偽装するのは本当に簡単です。あなたは[Mockito](http://code.google.com/p/mockito/) – Kai

+0

に慣れていなければなりません。特定の方法でビジネスロジックを制約するのを避けるために、私は 'Connection.createStatement' 'Connection.prepareStatement'や' Connection.prepareCall'や 'Connection.nativeSql'さえありますが、いずれも*正しい*である(データが手続きに渡される)。私はこれらすべてのものを模倣しないようにしています。少なくとも、私は自分自身でそれらのモックを書く必要があります。 – Coderer

答えて

2

モックストアドプロシージャを使用してメモリ内HSSQLデータベースを作成することができます。 mock sprocはテーブルに行を挿入して、実行されたパラメータとそのパラメータを示します。 テスト中のコードを実行し、dbを調べて何が起きたかを確認します。

+0

これはテスト実行中にどのくらいのオーバーヘッドを生成しますか?現在、残りのテストは数ミリ秒で実行できます - スタンドアップ/ティアダウンの時間は重要ですか? – Coderer

+1

私はそれをタイムアウトしたことはありませんが、私はそれが作成する一時ファイルのために数十msを推測します。これらのタイプのテストがほんの一握りであれば、心配する必要はありません。あなたが何千人もいたら、あなたはそうかもしれない。それらの間でテーブルをクリーンアップする限り、いつでも同じデータベースインスタンスを複数のテストで共有できます。私はひどくたくさんのテストのためにメモリDBを使用し、実行時間をはるかに上回るシンプルさの勝利を見つける。別のjdbc接続文字列を渡すだけでコードを変更する必要はありません。それは大きな利点です。 – AutomatedMike

+0

HSQLDBのマニュアルは何百ものページであり、HSQLDBで単体テストについて知ることができるブログ投稿などのほとんどは、休止/春。データベースを起動し、テーブルとストアドプロシージャを追加し、完了したらそれを破棄するだけです。それは簡単でしょう、そうですか? – Coderer

0

接続モッキングにデコレータデザインパターンを使用できます。使用するドライバを使用してDBへの実際の接続を作成します。このドライバは、Connectionインタフェースを実装し、実際のConnectionをメンバとして保持するConnectionImplクラスでラップされます。
あなたが実際にやりたくない実際の呼び出しはすべて模擬コードで置き換えてください。また、実際の接続オブジェクトの同じメソッド(呼び出しを委任する)を呼び出すすべての呼び出しを置き換えてください。
このように、いつものようにコーディングしているだけで、接続を作成するメソッドと返されるオブジェクトの違いがあります。
これで、mockオブジェクト(ConnectionImpl)に入力などをチェックするユニットテストコードを追加できます。

+0

ここでの問題は、私がOPについての私のコメントで言うように、私はConnectionの勇気を掘り下げようとしていないということです。ラッパーは、何をチェックするかを知る必要があります。同じことを達成する4つまたは5つの異なる方法の間で実行のどの点が共通しているか。方法、@ AutomatedMikeの答えよりも多くの仕事。 – Coderer

0

MyObjectWriterがどういう仕組みになっているか心配していないのであれば、統合テストを書いて単体テストについて忘れてしまいます。

ストアドプロシージャをテストする方法については言及していませんので、私を許してください。MyObjectWriterについてのテストを作成し、データベースの実際のストアドプロシージャを呼び出し、その後データベースの状態を確認してください。可能であれば、テスト期間を短縮するために、メモリ内のデータベースを使用します。

関連する問題