簡體   English   中英

如何在Junit中調用數據源

[英]How to call datasource in Junit

我有一個帶有JSF頁面的Maven WAR軟件包。 通常我用

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

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

您是否真的要針對數據庫運行單元測試? 我個人會盡量避免這種情況,因為它通常將測試與數據庫狀態聯系得太緊,並且經常阻止您實際測試“單元”以及您可能要處理的所有可能狀態。 這也可能會使您的單元測試花費一些時間,這並不理想。

一種替代方法是使用例如EasyMockMockito創建模擬DataSource 或者,如果您知道要在許多測試中為DataSources定義一些常見行為,則可以創建自己的DataSource接口的模擬實現。

如果您確實想使用數據庫,則必須查看手動實例化您正在使用的DataSource任何實現(例如OracleDataSource ),然后在您的類中使用它。

無論哪種情況,您都可能不得不切換到使用構造函數或方法注入,以使其在測試實例上設置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());
    }
}

如果確實需要使用注入的數據源運行測試,則可以考慮使用Arquillian,它將為您創建一個部署單元,將其與配置好的數據源一起部署到嵌入式或遠程Glassfish容器中(如果需要)。 他們有針對此特定方案的指南

好處是您將擁有一個帶有CDI的功能齊全的容器。 您可以控制獲取軟件包的內容,以便為CDI類提供測試存根。 您還可以控制部署配置(測試與生產配置)。 它是非侵入性的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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