在我們的公司,我們有一個服務層,它接受一些請求XML,通過JDBC訪問各種存儲過程(SP),處理數據並響應一些響應XML。最近人們開始在他們的JUnit測試中採用MockRunner來模擬SP的響應。該代碼設置從SP的使用Mockrunner用嘲笑的迴應看起來可怕(這是第一次隨機測試類我打開):爲什麼我會使用MockRunner而不是正常/手動依賴注入?
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調用方類,然後爲每個存儲過程調用設置上述所有代碼。請指教!謝謝
感謝您的支持。我很熟悉我喜歡的Mockito。 – 2010-08-04 10:57:22