MongoDBを使ったユニットテスト
質問
私が選択したデータベースはMongoDBです。私は、クライアントアプリケーションから実装の詳細を抽象化するために、データ層APIを書いています。
私は、TDD方式で自分のロジックをテストしています。各ユニットテストの前に
@Before
メソッドが呼び出されてデータベースのシングルトンが作成されます。その後、テストが完了すると
@After
メソッドが呼び出され、データベースを削除します。これはユニットテスト間の独立性を促進するのに役立ちます。
ほとんどすべてのユニットテスト、すなわち コンテキストクエリを実行する など、ほとんどすべてのユニットテストは、何らかの挿入ロジックが事前に発生することを必要とします。私の公開インターフェースは挿入メソッドを提供します。しかし、このメソッドを各単位テストの前置ロジックとして使用するのは正しくないように思えます。
本当に私は何らかのモッキングメカニズムが必要です。しかし、私はモッキングフレームワークについてあまり経験がなく、GoogleはMongoDBで使用できるモッキングフレームワークについて何も返さないようです。
このような状況で他の人はどうしているのでしょうか?つまり、データベースと相互作用するコードをどのようにユニットテストしているのでしょうか?
また、私の公開インターフェースは外部設定ファイルで定義されたデータベースに接続します。この接続を私のユニットテストに使用するのは間違っているように思えます。
どのように解決するのですか?
sbridgesがこの投稿で書いたように、データアクセスをロジックから抽象化する専用のサービス(リポジトリやDAOとも呼ばれることがあります)を用意しないのは悪い考えです。それから、DAO のモックを提供することによってロジックをテストできます。
私が行っている別のアプローチは、Mongoオブジェクトのモック(例えばPowerMockito)を作成し、適切な結果を返すというものです。 これは、ユニットテストでデータベースが動作するかどうかをテストする必要はなく、正しいクエリがデータベースに送信されたかどうかをテストする必要があるためです。
Mongo mongo = PowerMockito.mock(Mongo.class);
DB db = PowerMockito.mock(DB.class);
DBCollection dbCollection = PowerMockito.mock(DBCollection.class);
PowerMockito.when(mongo.getDB("foo")).thenReturn(db);
PowerMockito.when(db.getCollection("bar")).thenReturn(dbCollection);
MyService svc = new MyService(mongo); // Use some kind of dependency injection
svc.getObjectById(1);
PowerMockito.verify(dbCollection).findOne(new BasicDBObject("_id", 1));
というのも選択肢の一つでしょう。もちろん、モックの作成と適切なオブジェクトの返送は、上記の例としてコード化されているだけです。
関連
-
代入の左辺は変数でなければならない 解答
-
Java の double データ型における 0.0 と -0.0 の問題
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] データベース駆動型アプリケーションのユニットテストに最適な戦略とは?
-
[解決済み】PHPUnitでprotectedメソッドをテストするためのベストプラクティス
-
[解決済み] Entity Framework 6のユニットテストはどうなっているのか、気になりますか?
-
[解決済み] ファイルシステムに依存するコードの単体テスト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Javaでよくある構文エラー
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
強制型変換について
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
セミコロン期待値エラー解決
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Java基礎 - マッピングとQ/A
-
アクセス制限の解決方法: ---- in Java