2012-10-26 46 views
1

我正在爲使用JMockito和sling commons測試API的CQ5應用程序編寫JUnit測試用例。我能夠模擬請求參數。我的實際Java方法有一些邏輯來迭代請求參數映射,例如requestParamMapObj.keySet()。iterator()並獲得一些節點屬性。但是當我運行單元測試用例時,所述keySet迭代器沒有得到執行並且拋出目標調用例外,即使requestParamMapObj也有數據。需要幫助編寫CQ5.4應用程序的JUnit測試用例

這是我第一次爲內容管理應用程序編寫JUnit測試用例。

任何幫助是非常可觀的。

這裏是我的測試方法代碼:

this.context.checking(new Expectations() { 
    { 
     this.one(mockRequest).getRequestParameterMap(); 
     this.will(returnValue(paramsMap)); 
    } 
}); 

當了JUnit達到下面的代碼則拋出目標調用異常。

private Map<String, String> getAllAnswers(final RequestParameterMap reqParamMap) { 
    final Iterator<String> keySetIterator1 = reqParamMap.keySet().iterator(); 
} 
+0

該異常與CQ5沒有任何關係。發佈您的代碼!沒有它就很難找出原因。 – exception

+0

這是我的測試方法的代碼this.context.checking(新的期望(){ \t \t \t \t { \t \t \t \t this.one(mockRequest).getRequestParameterMap(); \t \t \t \t this.will(的returnValue (paramsMap)); \t \t \t \t} \t \t \t});當Junit到達下面的代碼時,它將拋出目標調用異常。私人地圖 getAllAnswers(final RequestParameterMap reqParamMap){ \t \t final Iterator keySetIterator1 = reqParamMap.keySet()。iterator(); – Raja

回答

0

是的肖恩。你是對的,當我設置keySet()方法的期望時,它被調用。 this.allowing(paramsMap).keySet(); 但我的問題在於我們需要爲每一種行爲設定期望值。這是否有意義,我的意思是單元測試代碼變得比實際的java代碼更多:)。 我們是否有其他解決方案,以便我們減少測試代碼。

  this.allowing(resource).adaptTo(Node.class); 
      this.will(returnValue(node)); 

      this.allowing(node).hasNode("voting"); 
      this.will(returnValue(true)); 

      allowing(repository).loginAdministrative(null); 
      will(returnValue(session)); 

      allowing(session).getWorkspace(); 
      will(returnValue(workspace)); 

      allowing(workspace).getQueryManager(); 
      will(returnValue(queryManager)); 
+0

當您使用模擬對象時,通常必須爲您希望在該模擬對象上調用的每個方法設置期望值。有些方法確實可以擁有比正在測試的實際代碼更多的測試代碼 - 尤其是當您使用對抽象CQ5類的引用並在您的代碼中調用大量方法時。另一種解決方案可能是創建一個具體的類,它可以從任何你嘲笑的類中衍生出來,然後重寫它的方法 - 但是這也需要一些工作,可能會更脆弱。順便說一句,如果確實如此,一定要將我的答案標記爲答案。謝謝。 – Shawn

0

這將是有益的,看看完整的代碼,但基於您列出什麼,你commment到目前爲止,這聽起來或許你需要設置爲當密鑰集()方法會發生什麼期望調用。我猜想你可能已經嘲笑了ParameterMap對象,但是可能沒有在該ParameterMap上設置期望值,以便在調用keySet方法時知道該做什麼/返回。再次,我只是猜測,但我希望這會有所幫助。

相關問題