2013-02-04 33 views
2

我正在編寫一個JUnit測試,試圖測試與SqlServer數據庫的連接(我知道,我知道......我不應該單元測試數據庫)。問題是,我已經在glassfish中設置了數據源,事實上,ping測試「成功」。但是!當我試試這個:Java連接數據源永無止境

注:配置爲:從本地GlassFish(其中平OK),遠程數據庫單元測試

@Test 
public void simpleConnect() { 

    try { 
     Context ctx = new InitialContext(); 
     DataSource dataSource = (DataSource) ctx.lookup("MyDataSource"); 
     Connection con = dataSource.getConnection(); 
     assertTrue(con != null && dataSource != null); 
    } 
    catch (NamingException ex) { 
     fail("Cannot get connection: " + ex); 
    } 
    catch (SQLException ex) { 
     fail("Cannot get connection: " + ex); 
    } 

} 

什麼也沒有發生,測試永遠不會結束,NO拋出確定或失敗。我不知道我是否真的得到了連接。

+1

+1「我知道,我不應該這樣做「。 :-) –

回答

0

那麼這個想法最初是試圖測試與數據源的連接,以及我正在嘗試JUnit,但在我的情況下不起作用,所以我找到了一個使用JSP頁面的解決方案。

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@page import="java.sql.ResultSet"%> 
<%@page import="java.sql.PreparedStatement"%> 
<%@page import="java.sql.SQLException"%> 
<%@page import="java.sql.Connection"%> 
<%@page import="javax.sql.DataSource"%> 
<%@page import="javax.naming.InitialContext"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
        "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Test DataSource Connection</title> 
    </head> 
<body> 
<h1>Connecting to Pooled Database</h1> 
<% 
    InitialContext ctx = new InitialContext(); 
    DataSource ds = (DataSource) ctx.lookup("MyDataSource"); 
    Connection connection = ds.getConnection(); 

    if (connection == null) { 
     throw new SQLException("Error establishing connection!"); 
    } 

    PreparedStatement stmt = null; 
    ResultSet result = null; 
    stmt = connection.prepareStatement("{call StoredProcedure(?,?)}"); 
    stmt.setString(1, "1"); 
    stmt.setString(2, "2"); 
    result = stmt.executeQuery(); 

    while (result.next()) { 
     out.print(result.getString(1) + "<br>"); 
    } 
%> 

<h2>DataSource Working!</h2> 
</body> 
</html> 

當您運行JSP時,這將檢索調用存儲過程的結果集。很明顯,你可以替換一個簡單的查詢電話。如果,也許你需要了解如何創建,連接和配置數據源,看看這個鏈接信息(選擇表*)

http://netbeans.dzone.com/connection-pooling-glassfish-nb

0

嘗試關閉連接。

finally{ con.close; } 

通常對數據源進行Junit測試是不行的,它真的需要嗎?

+0

不,沒有工作。 – Sergio

0

測試中沒有任何東西顯然會導致它掛起。我建議在調試器中運行它以隔離其掛起的行。

+0

從來沒有找到行中的數據源:DataSource dataSource =(DataSource)ctx.lookup(「MyDataSource」); ,圍繞該行循環,只是出現一個信息:「com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient 信息:無法找到javadb客戶端jar文件,默認情況下derby jdbc驅動程序將不可用。」 – Sergio

+0

必須有一些將'MyDataSource'放入'Context'的代碼。請編輯您的問題並向我們展示它的外觀。 –

+0

爲什麼你使用'ctx.lookup()'?你爲什麼不在你的單元測試中創建一個數據源? –

0

要連接到的遠程GlassFish服務器需要的屬性傳遞給InitialContext構造JNDI上下文:

Properties props = new Properties(); 
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory"); 
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); 
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 
InitialContext ctx = new InitialContext(props); 

你可以把這叫做集成測試不是一個單元測試,你不犯法!

就個人而言,我不會在集成測試中使用這種從遠程Glassfish實例查找數據源的方法,我會使用Commons DBCP或類似方法創建一個數據源,以便您的測試在GlassFish關閉時運行。

+0

,我添加了連接代碼,但是,正在做同樣的事情。 – Sergio