Java Connect数据源永远不会结束

时间:2013-02-04 14:07:49

标签: java unit-testing datasource glassfish-3 junit4

我正在编写一个JUnit测试,试图测试与SqlServer数据库的连接(我知道,我知道......我不应该对数据库进行单元测试)。问题是,我已经在glassfish中设置了数据源,事实上,ping测试“成功”了。但是!,当我尝试这个时:

注意:配置为:Local Glassfish(ping OK),Remote DataBase

的单元测试
@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抛出Ok或Fail。我不确切地知道我是否真的得到了连接。

4 个答案:

答案 0 :(得分:0)

尝试关闭连接。

finally{ con.close; }

通常情况下,不需要对数据源进行Junit测试,是否真的需要?

答案 1 :(得分:0)

测试中没有任何东西显然导致它挂起。我建议在调试器中运行它以隔离它挂起的行。

答案 2 :(得分:0)

要连接到远程Glassfish服务器的JNDI上下文,需要将属性传递给InitialContext构造函数:

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实例查找DataSource的方法,我会使用Commons DBCP或类似的方法创建一个DataSource,这样当GlassFish关闭时你的测试就会起作用。

答案 3 :(得分: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时,将检索对存储过程的调用的结果集。显然你可以用一个简单的查询替换这个调用(select * from table)

如果您需要有关如何创建,连接和配置数据源的信息,请查看以下链接:http://netbeans.dzone.com/connection-pooling-glassfish-nb