我正在經歷一個困難的時間,弄清楚如何解決單元測試問題。我很少或沒有'單元測試'的經驗。我試圖只在絕對必要的情況下用最小的更改來更改classUnderTest。如何Java單元測試一個複雜的類
我使用的是JUnit 4,我願意嘗試使用Mockito,JMockit或任何其他有助於進行高效且有效的單元測試的庫。我正在爲數據庫使用JDBC。
問題:
內classUnderTest,我訪問靜態數據庫。
SpecializedDao specializedDao = SpecializedDao.getSpecializedDao();
ObjectX objectResult = specializedDao.currentObjectXByTimestamp(x, x, x, x, x, x);
我試圖用一個有效的配置和一個無效的配置做單元測試用例。解決這個問題的正確方法是什麼?
一些可能解決方案,我已經研究有:
- 不知怎麼傳遞,或者「注射」假ObjectXResult類_對象
- 模擬數據庫(如果甚至有可能與靜數據庫引用,使用單獨的單元測試servlet引用一個假的SpecializedDao類?)
- 使用Mockito與injectMocks,間諜,當(方法調用參數)然後返回結果,或一些其他實現Mockito規定。
- 開放給任何其他解決方案。
問題:
內classUnderTest,我使用的另一項複雜的處理類class2,做了很多工作,像這樣:
result = class2.execute(x, x, x, x, x, x);
類class2做處理的東西,並返回結果ENUM或一些例外。我該如何處理這個問題,並在classUnderTest上保留此特定單元測試的範圍。 class2訪問數據庫,並做了很多工作,這就是爲什麼它是它自己的類,但我認爲最後三個測試用例依賴於處理以徹底測試class classUnderTest。
感謝您對我的支持,我儘可能以儘可能清晰的方式提出問題。
這聽起來像你有幾層在這裏測試。在我的組織中,我們使用像服務層(稱爲dao層)和dao層(實際上調用jdbc調用)的體系結構。就單元測試而言,要考慮按班級分開你的班級。因此,對於執行實際「業務邏輯」的服務層,您可以使用EasyMock等模擬DAO調用。這將允許您將特定邏輯與服務層隔離開來。對於你的DAO層,你可以考慮使用類似嵌入式數據庫(DERBY)的東西來測試 – Jason
如果你絕對不能改變類,PowerMockito允許你模擬靜態方法。但我傾向於認爲使用PowerMockito作爲設計失敗的必要性 - 可測試性應該首先是設計標準之一。 –