无法在JUnit中获取JDBC连接

时间:2015-05-19 02:27:56

标签: java xml spring jdbc junit

我看过其他与此问题相关的帖子,但似乎无法理解和/或适用于我的代码来解决问题。因此,您的帮助将非常有用。

这是错误堆栈跟踪:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JPanel;

public class Screen extends JPanel implements Runnable {

    private static final long serialVersionUID = 1L;

    public static final int WIDTH = 800, HEIGHT = 800;
    private Thread thread;
    private boolean running = false;

    private BodyPart b;
    private ArrayList<BodyPart> snake;

    private Apple apple;
    private ArrayList<Apple> apples;

    private Random r;

    private int xCoor = 20, yCoor = 20;
    private int size = 10;
    private int score = 0;

    private boolean right = true, left = false, up = false, down = false;

    private int ticks = 0;

    private Key key;

    public Screen() {
        setFocusable(true);
        key = new Key();
        addKeyListener(key);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));

        r = new Random();

        snake = new ArrayList<BodyPart>();
        apples = new ArrayList<Apple>();

        start();
    }

    public void reset() {
        snake.clear();
        apples.clear();
        xCoor = 20;
        yCoor = 20;
        size = 10;
        score = 0;
        running = true;
    }

    public void tick() {
        if(snake.size() == 0) {
            b = new BodyPart(xCoor, yCoor, 20);
            snake.add(b);
        }

        if(apples.size() == 0) {
            int xCoor = r.nextInt(40);
            int yCoor = r.nextInt(40);

            apple = new Apple(xCoor, yCoor, 20);
            apples.add(apple);
        }

        for(int i = 0; i < apples.size(); i++) {
            if(xCoor == apples.get(i).getxCoor() && yCoor ==  apples.get(i).getyCoor()) {
                size++;
                apples.remove(i);
                score += 10;
                i--;
            }
        }

        for(int i = 0; i < snake.size(); i++) {
            if(xCoor == snake.get(i).getxCoor() && yCoor ==  snake.get(i).getyCoor()) {
                if(i != snake.size() - 1) {
                    reset();
                }
            }
        }

        if(xCoor < 0) xCoor = 40;
        if(xCoor > 40) xCoor = 0;
        if(yCoor < 0) yCoor = 40;
        if(yCoor > 40) yCoor = 0;

        ticks++;

        if(ticks > 250000) {
            if(right) xCoor++;
            if(left) xCoor--;
            if(up) yCoor--;
            if(down) yCoor++;

            ticks = 185000;

            b = new BodyPart(xCoor, yCoor, 20);
            snake.add(b);

            if(snake.size() > size) {
                snake.remove(0);
            }
        }
    }

    public void paint(Graphics g) {
        g.clearRect(0, 0, WIDTH, HEIGHT);

        g.drawString("Score: " + score, 100, 100);
            g.setColor(Color.WHITE);

        g.setColor(new Color(20, 50, 0));
        g.fillRect(0, 0, WIDTH, HEIGHT);

        g.setColor(Color.BLACK);
        for(int i = 0; i < WIDTH / 20; i++) {
            g.drawLine(i * 20, 0, i * 20, HEIGHT);
        }

        for(int i = 0; i < HEIGHT / 20; i++) {
            g.drawLine(0, i * 20, WIDTH, i * 20);
        }

        for(int i = 0; i < snake.size(); i++) {
            snake.get(i).draw(g);
        }
        for(int i = 0; i < apples.size(); i++) {
            apples.get(i).draw(g);
        }

    }

    public void start() {
        running = true;
        thread = new Thread(this, "Game Loop");
        thread.start();
    }

    public void stop() {
        running = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void run() {
        while(running) {
            tick();
            repaint();
        }
    }

    private class Key implements KeyListener {

        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();

            if(key == KeyEvent.VK_RIGHT && !left) { 
                up = false;
                down = false;
                right = true;
            }

            if(key == KeyEvent.VK_LEFT && !right) { 
                up = false;
                down = false;
                left = true;
            }

            if(key == KeyEvent.VK_UP && !down) {
                left = false;
                right = false;
                up = true;
            }

            if(key == KeyEvent.VK_DOWN && !up) {
                left = false;
                right = false;
                down = true;
            }

        }



    }

我的FormMatrixDaoImpl类:

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:627)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:692)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:724)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:734)
at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:899)
at com.cinfin.edocs.services.dao.FormMatrixDaoImpl.validateNonProductionStatusInMatrix(FormMatrixDaoImpl.java:857)
at com.cinfin.edocs.services.dao.FormMatrixDaoImplTest.testValidateNonProductionStatusInMatrix(FormMatrixDaoImplTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:72)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:81)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.sql.SQLException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver'
at org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2001)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1897)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1413)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
... 36 more
Caused by: java.lang.ClassNotFoundException: com.ibm.db2.jcc.DB2Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:1992)
... 40 more

我的FormMatrixDaoImplTest类:

import javax.sql.DataSource;

@Repository
public class FormMatrixDaoImpl extends NamedParameterJdbcDaoSupport implements FormMatrixDao {

@Autowired  
public FormMatrixDaoImpl(@Qualifier("vitDataSource") DataSource dataSource, @Value("#{edocsQueryMap}") HashMap<String, String> edocsQueryMap) {
    super();

        @Override
    public SqlRowSet validateNonProductionStatusInMatrix(String projectId) throws SQLException {
        logger.info("validateNonProductionStatusInMatrix. projectId: "+projectId);

        SqlRowSet ret = getJdbcTemplate().queryForRowSet(qValidateNonProductionStatusInMatrix, new Object[] {projectId});

        return ret;
    }
}

我的datasources.xml文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:datasources.xml","classpath:edocservices.xml","classpath:edocservicesclients.xml", "/WEB-INF/edocservices-servlet.xml"})
@ActiveProfiles("local")

public class FormMatrixDaoImplTest {

@Autowired
private FormMatrixDaoImpl formMatrixDaoImpl;
public FormMatrixDaoImpl getFormMatrixDaoImpl() {
    return formMatrixDaoImpl;
}
public void setFormMatrixDaoImpl(FormMatrixDaoImpl formMatrixDaoImpl) {
    this.formMatrixDaoImpl = formMatrixDaoImpl;
}

@Test
public final void testValidateNonProductionStatusInMatrix() throws SQLException {
    SqlRowSet test = formMatrixDaoImpl.validateNonProductionStatusInMatrix("0b003e8880072976");
    assertEquals(test,null);
    }

我的edocservices.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util" 
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd"> 

<beans profile="production,user,quality,development">         
    <bean id="vitDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
        <description>JNDI VITEDOC DB2 datasource</description>
        <property name="jndiName" value="${database.vitedoc.jndi}"/>        
    </bean>
    <bean id="docDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
        <description>JNDI DOCEDOC DB2 datasource</description>
        <property name="jndiName" value="${database.docedoc.jndi}"/>        
    </bean>

    <beans profile="local">     
    <bean id="vitDataSource" class="org.apache.commons.dbcp2.BasicDataSource" lazy-init="true" destroy-method="close">
        <description>Standalone VITEDOC datasource</description>
        <property name="driverClassName" value="${database.vitedoc.driver.classname}"/>
        <property name="url" value="${database.vitedoc.url}" />
        <property name="username" value="${database.vitedoc.username}"/>
        <property name="password" value="${database.vitedoc.password}"/>
    </bean>
    <bean id="docDataSource" class="org.apache.commons.dbcp2.BasicDataSource" lazy-init="true" destroy-method="close">
        <description>Standalone DOCEDOC datasource</description>
        <property name="driverClassName" value="${database.docedoc.driver.classname}"/>
        <property name="url" value="${database.docedoc.url}" />
        <property name="username" value="${database.docedoc.username}"/>
        <property name="password" value="${database.docedoc.password}"/>
    </bean>
</beans>

上面的xml有marshallers,unmarshallers,endpoints&amp;的WSDL。

这是我的edocservicesclient.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:ws="http://www.springframework.org/schema/web-services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:c="http://www.springframework.org/schema/c"    
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" 
xmlns:jms="http://www.springframework.org/schema/jms"   
xsi:schemaLocation="http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services.xsd
                    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd                       
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd                      
                    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd">

上面的xml还有一些其他的marshallers,unmarshallers和saajmessagefactory。

这是我的edocservices-servlet.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
xmlns:util="http://www.springframework.org/schema/util"     
xmlns:context="http://www.springframework.org/schema/context"   
xmlns:oxm="http://www.springframework.org/schema/oxm"       
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd       
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-4.1.xsd">

<context:property-placeholder location="classpath:edocservices.properties"/>
<context:component-scan base-package="com.cinfin.edocs.services"/>

当我将FormMatrixDaoImplTest类作为JUnit测试运行时,我得到了无法获得jdbc连接错误。此错误仅与JUnit测试相关联,并且在程序本地运行时不会出现。所以我有一种感觉,我可能会错过JUnit设置或类似的东西。

任何帮助指出代码中的错误/错误和/或指向其他方式来测试运行&#39;选择&#39;从数据库中检索数据的命令将受到高度赞赏。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

错误无法加载JDBC驱动程序类&#39; com.ibm.db2.jcc.DB2Driver&#39;声明包含类的jar在运行时类路径中不可用。确保包含类的jar可用。

参考:How to Set Runtime classpath with eclipse

答案 1 :(得分:0)

1)从我上面的笔记:

  

听起来你可能正在使用Spring on WebSphere。核心   您的日志中的错误是Cannot load JDBC driver class com.ibm.db2.jcc.DB2Driver

     

建议:

     
      
  1. 跟踪JNDI定义(例如,vitDataSource)定义其驱动程序的位置   类名(如database.vitedoc.driver.classname
  2.         

    2)确保这一点   DB2Driver可用作WebSphere Admin中的JDBC资源   安慰   ......和/或......

         

    3)确保在您的配置中配置了DB2驱动程序.jar   pom.xml(如果你使用的是Maven)。

2)你已经确认:

  

“......类名定义为:database.vitedoc.driver.classname = com.ibm.db2.jcc.DB2Driver”

     

&lt; =好!

3)所以现在你需要做的就是:

a)确保你有一个有效的db2jcc.jar:

http://www-01.ibm.com/support/docview.wss?uid=swg21363866

b)确保.jar在类路径中

如果您正在运行WebSphere,我的首选是在WebSphere Admin控制台中执行此操作:

http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/tdat_ccrtpds.html?cp=SSAW57_8.5.5%2F1-3-0-23-3-0-7-2

如果这是一个简单的Web应用程序,您只需将其添加到Eclipse项目的\ lib文件夹中:

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.wst.webtools.doc.user%2Ftopics%2Fccwebprj.html

答案 2 :(得分:0)

以下是如何将第三方库添加到eclipse中。

  1. 打开eclipse转到包浏览器。
  2. 右键单击您的项目并选择项目属性。
  3. 点击左侧栏中的java Build path 弹出。
  4. 选择“库”选项卡。
  5. 选择&#34;添加外部Jar文件&#34;并使用浏览器导航到您的JAR文件并选择它们&#34;打开&#34;然后&#34;好的&#34;。