我有一個帶有JSF頁面的maven WAR包。通常我使用如何在Junit中調用數據源
@Resource(name = "jdbc/Oracle")
private DataSource ds;
當我在Glassfish服務器上部署WAR包時調用數據庫。但在JUnit測試中,當我使用netbeans在我的筆記本電腦上構建包時,我無法使用此數據源。 我該如何解決這個問題?我想在構建包後立即運行帶有數據庫表的JUnit測試,但沒有數據源。 什麼是可能的解決方案?
我有一個帶有JSF頁面的maven WAR包。通常我使用如何在Junit中調用數據源
@Resource(name = "jdbc/Oracle")
private DataSource ds;
當我在Glassfish服務器上部署WAR包時調用數據庫。但在JUnit測試中,當我使用netbeans在我的筆記本電腦上構建包時,我無法使用此數據源。 我該如何解決這個問題?我想在構建包後立即運行帶有數據庫表的JUnit測試,但沒有數據源。 什麼是可能的解決方案?
你真的想對數據庫運行你的單元測試嗎?就我個人而言,我會盡量避免這種情況,因爲它通常將測試與數據庫狀態緊密聯繫在一起,並且經常會阻止您實際測試「單元」以及您可能想要處理的所有可能狀態。它也可能會讓你的單元測試花費一些時間來運行,這並不理想。
另一種方法是創建一個模擬DataSource
,例如使用EasyMock或Mockito。或者你可以創建自己的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());
}
}
如果確實需要使用注入的數據源來運行測試,那麼可以考慮使用Arquillian,它將爲您創建一個部署單元,將其部署到嵌入式或遠程Glassfish容器,以及配置的專用於測試的DataSource無線SH。對於這種特定場景,他們有一個guide。
優勢是你將擁有一個擁有CDI的成熟容器。您可以控制獲取軟件包的內容,以便爲CDI類提供測試存根。您還可以控制部署配置(測試與生產配置)。它是非侵入性的。