我在这个例子中找到了如何在JUnit https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit
中注入JNDI数据源我试过了:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class KnowledgebaseTest
{
public KnowledgebaseTest()
{
}
@BeforeClass
public static void setUpClass() throws Exception
{
// rcarver - setup the jndi context and the datasource
try
{
// Create initial context
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES,
"org.apache.naming");
InitialContext ic = new InitialContext();
ic.createSubcontext("java:");
ic.createSubcontext("java:/comp");
ic.createSubcontext("java:/comp/env");
ic.createSubcontext("java:/comp/env/jdbc");
String host = "localhost";
int port = 5432;
String dbName = "defaulDB";
String username = "admin";
String password = "qwerty";
Class.forName("org.postgresql.Driver");
Connection conn = null;
conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/" + dbName, username, password);
conn.close();
ic.bind("jdbc/DefaultDB", conn);
}
catch (NamingException ex)
{
Logger.getLogger(KnowledgebaseTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
@AfterClass
public static void tearDownClass()
{
}
@Before
public void setUp()
{
}
@After
public void tearDown()
{
}
@Resource(name = "jdbc/DefaultDB")
DataSource ds;
@Test
public void testPageFirst() throws SQLException
{
if (ds == null)
{
throw new SQLException("Can't get data source");
}
Connection conn = ds.getConnection();
if (conn == null)
{
throw new SQLException("Can't get database connection");
}
PreparedStatement ps = null;
boolean committed = false;
try
{
conn.setAutoCommit(false);
ps = conn.prepareStatement("UPDATE ACCOUNT SET LAST_LOGIN = CURRENT_DATE WHERE USER_NAME = ?");
ps.setString(1, "TIMESTAMP");
ps.executeUpdate();
ps.close();
conn.commit();
committed = true;
}
finally
{
if (!committed)
{
conn.rollback();
}
if (ps != null)
{
ps.close();
}
conn.close();
}
}
}
但是我收到了这个错误:
javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory]
Caused by: java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory
你能告诉我如何解决这个问题吗?