2013-02-18 25 views
0

我有一個帶有JSF頁面的maven WAR包。通常我使用如何在Junit中調用數據源

@Resource(name = "jdbc/Oracle") 
    private DataSource ds; 

當我在Glassfish服務器上部署WAR包時調用數據庫。但在JUnit測試中,當我使用netbeans在我的筆記本電腦上構建包時,我無法使用此數據源。 我該如何解決這個問題?我想在構建包後立即運行帶有數據庫表的JUnit測試,但沒有數據源。 什麼是可能的解決方案?

回答

3

你真的想對數據庫運行你的單元測試嗎?就我個人而言,我會盡量避免這種情況,因爲它通常將測試與數據庫狀態緊密聯繫在一起,並且經常會阻止您實際測試「單元」以及您可能想要處理的所有可能狀態。它也可能會讓你的單元測試花費一些時間來運行,這並不理想。

另一種方法是創建一個模擬DataSource,例如使用EasyMockMockito。或者你可以創建自己的DataSource接口的模擬實現,如果你知道你想在很多測試中定義DataSources的一些常見行爲。

如果你真的想使用數據庫,你必須手動實例化你正在使用的DataSource的任何實現(例如OracleDataSource),然後在你的類中使用它。

無論哪種情況,您都可能必須切換到使用constructor or method injection才能更容易在要測試的實例上設置DataSource。 (否則,你將不得不使用反射來設置私有變量。)

例如,你的類可能是這樣的:

public class DatabaseOperations { 
    private DataSource dataSource; 

    @Resource(name = "jdbc/Oracle") 
    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 
} 

然後測試可能是這樣的:

public class DatabaseOperationsTest { 
    public void testSomeOperation() { 
     DatabaseOperations databaseOperations = new DatabaseOperations(); 
     databaseOperations.setDataSource(new MockDataSource()); 
    } 
} 
1

如果確實需要使用注入的數據源來運行測試,那麼可以考慮使用Arquillian,它將爲您創建一個部署單元,將其部署到嵌入式或遠程Glassfish容器,以及配置的專用於測試的DataSource無線SH。對於這種特定場景,他們有一個guide

優勢是你將擁有一個擁有CDI的成熟容器。您可以控制獲取軟件包的內容,以便爲CDI類提供測試存根。您還可以控制部署配置(測試與生產配置)。它是非侵入性的。

相關問題