为JUnit测试注入JNDI数据源

时间:2016-04-04 14:38:51

标签: java junit junit4

我在这个例子中找到了如何在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

你能告诉我如何解决这个问题吗?

0 个答案:

没有答案