我正在编写一个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。我不确切地知道我是否真的得到了连接。
答案 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