簡體   English   中英

Junit測試調用Dao類的Business類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM