私たちの共同体には、いくつかの要求XMLを受け取り、JDBCを介してさまざまなStored Procecdures(SP)にアクセスし、データを処理し、いくつかの応答XMLで応答するサービスレイヤーがあります。最近、人々はSPからの応答をモックするためにJUnitテストでMockRunnerを採用し始めています。MockRunnerを使用してSPからのモック応答をセットアップするコードはひどいように見えます(これは私が開いた最初のランダムテストクラスです):
MockConnection connection = new MockConnection();
MockContextFactory.setAsInitial();
InitialContext context = new InitialContext();
context.rebind(READ_PAYMENT_DATA_SOURCE, getDS());
getDS().setupConnection(connection);
m_csStatementHandler = connection.getCallableStatementResultSetHandler();
m_csStatementHandler.clearResultSets();
m_csStatementHandler.clearCallableStatements();
m_csStatementHandler.setExactMatch(false);
m_csStatementHandler.prepareReturnsResultSet(READ_PAYMENT, true);
m_csStatementHandler.setExactMatch(false);
m_csStatementHandler.setExactMatchParameter(false);
Map parameterMap = new HashMap();
parameterMap.put(new Integer(1), null);
parameterMap.put(new Integer(2), null);
parameterMap.put(new Integer(3), null);
parameterMap.put(new Integer(4), null);
m_csStatementHandler.prepareOutParameter(READ_PAYMENT, parameterMap);
//Set up the cursor of applications for return.
MockResultSet resultApps = m_csStatementHandler.createResultSet();
resultApps.addRow(getPaymentSchedule("E", "Monthly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("A", "Weekly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("R", "Yearly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("S", "Weekly", new Short("1"),null,null,null,null,null,null,null));
resultApps.addRow(getPaymentSchedule("W", "Monthly", new Short("1"),null,null,null,null,null,null,null));
MockResultSet[] results = new MockResultSet[1];
results[0] = resultApps;
m_csStatementHandler.prepareResultSet(READ_PAYMENT, resultApps);
上記のコードは多くの理由でひどいですが、ストアドプロシージャからの応答を設定することの複雑さとオーバーヘッドを明確に示しています。
これまで、ストアドプロシージャを実際に呼び出すクラスを注入する代わりに、手動でロールされた依存性注入を使用してきました。私がしなければならないのは、モックSP呼び出し元クラス(SPの実際の実行を担当)を作成し、必要な応答データを設定することだけです。私はこの手法に非常に満足しており、実装の詳細を気にすることなくデータに焦点を合わせているため、上記よりもはるかに単純です。しかし、私の質問は、いつMockRunnerを使用したいのかということです。単体テストにはやり過ぎのようですが、統合やシステムテストの方が多いと思いますか?それでも、DIフレームワークを使用してSP呼び出し元クラスをスワップアウトし、ストアドプロシージャ呼び出しごとに上記のすべてのコードをセットアップする方が簡単だと思います。啓発してください!ありがとう