2

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

注意:配置是:来自本地 Glassfish 的单元测试(ping 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 抛出 Ok 或 Fail。我不知道我是否真的得到了联系。

4

4 回答 4

0

尝试关闭连接。

finally{ con.close; }

通常在数据源上进行 Junit 测试是不行的,真的需要吗?

于 2013-02-04T14:13:43.313 回答
0

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

于 2013-02-04T14:14:49.333 回答
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 关闭时进行测试。

于 2013-02-04T14:25:07.100 回答
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

于 2013-02-04T16:04:46.010 回答