[英]Junit test the Business class that invokes Dao class
我要接管使用Struts和純JDBC框架實現的產品。 我計划在項目中實施Junit測試,以加快測試速度。 僅供參考,該項目尚未投入生產。 它仍處於開發階段,但使用的是非常古老的技術。 該項目沒有任何接口和相應的實現。 類之類的舊程序直接被實例化並使用。 因此,不能使用Mockito框架。 由於所有這些限制,我需要將TDD開發到項目中。 我無法完全放棄和開發新技術。
我的問題是:我正在為業務層寫下一個junit測試,以檢查該方法是否有效。 該商務艙也正在致電DAO。 由於在測試時未創建數據庫連接,因此出現連接錯誤。 如何編寫junit測試以僅測試業務層? 我是否需要在測試方法中包括DAO連接? 如果是,我該如何實現?
我是Junit和TDD的新手。 因此,如果我的理解有誤,請指導我或解決此問題。
您可以重構代碼嗎? 如果是這樣,您可以從重構代碼開始,為真正的DAO定義DAO接口,實現新創建的接口的模擬版本,並將其注入到單元測試中的服務中。
在沒有任何框架的情況下將DAO注入服務類的最簡單方法可能是構造函數注入,即將DAO實例傳遞給服務類構造函數。
public class YourService {
private final YourDAOInterface dao;
public YourService(YourDAOInterface dao) {
this.dao = dao;
}
}
在這里,構造函數dao
的參數可以是真實的DAO或用於測試的模擬實現(您需要使這兩個DAO實現相同的接口YourDAOInterface
)。
我建議在執行其他任何操作之前將其重構為可測試的狀態。 如果設計確實像您所說的那樣壞,那么現在可以通過一種方法為特定的類編寫有用的Test。
我想,您撰寫的第一段與您在第二段中最終提出的問題無關。
我們稱其為單元測試是有原因的-因為我們僅測試一個單元-而不是集成測試。 我們在這里不混淆各層。
如果您的目標是僅測試業務層-您僅測試業務層,然后嘲笑下面的所有內容(例如DAO等)。 因此,使用一些模擬框架(Mockito,PowerMock,JMockit等)為您的業務層代碼提供數據,並假設您的DAO層是正確的。
通過使用模擬框架,可以為業務功能提供與DAO層應該從數據庫移交的數據相同的數據,而您根本不需要執行DAO層。 除了JUnit之外,您還需要這些模擬API才能正確編寫單元測試。
對於您的問題的注釋建議使用內存數據庫和框架(那里有Apache DBUnit和H2 DB),但是在為DAO層而不是業務層編寫單元測試時,將需要這些注釋。
正如其他答案所建議的那樣,始終建議進行重構並使代碼可測試。
希望能幫助到你 !!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.