2015-05-19 18 views
0

Я видел другие сообщения, связанные с проблемой, но, похоже, не мог понять это и/или применять к моим кодам, чтобы исправить проблему. Следовательно, ваша помощь будет очень полезна.Не удалось получить соединение JDBC в JUnit

Вот стек ошибки трассировки:

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 

Мой FormMatrixDaoImpl класс:

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; 
    } 
} 

Мой FormMatrixDaoImplTest класс:

@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); 
    } 

Мой datasources.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> 

Мой edocservices.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, конечные точки & WSDL,.

Вот мой edocservicesclient.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"/> 

выше 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:context="http://www.springframework.org/schema/context" xmlns:oxm="http://www.springframework.org/schema/oxm" 
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" 
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" 
xmlns:cache="http://www.springframework.org/schema/cache" xmlns:task="http://www.springframework.org/schema/task"    
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-4.1.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-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/cache http://www.springframework.org/schema/cache/spring-cache-4.1.xsd 
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"> 

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

Когда я запускаю мой FormMatrixDaoImplTest класс как тест JUnit, я получаю не может получить сообщение об ошибке соединения JDBC. Эта ошибка связана только с тестом JUnit и не появляется, когда программа выполняется локально. Поэтому у меня такое чувство, что я могу что-то упустить с настройкой JUnit или что-то в этом роде.

Любая помощь, указывающая ошибки/ошибки в кодах и/или указывающие на другой способ проверки команды «выбрать» для извлечения данных из базы данных, будет высоко оценена.

Заранее спасибо.

+1

Таким образом, как раз небрежно, похоже, что кувшин, содержащий класс вашего водителя, не доступен во время тестирования. Вы используете Maven? Gradle? Убедитесь, что в объем зависимостей входит «тест». – billjamesdev

+0

Похоже, вы, вероятно, используете Spring на WebSphere. Основная ошибка в вашем журнале - «Невозможно загрузить класс драйвера JDBC» com.ibm.db2.jcc.DB2Driver'. ПРЕДЛОЖЕНИЯ: 1) отслеживать, где ваши определения JNDI (например, 'vitDataSource') определяют их имена классов драйверов (например.' Database.vitedoc.driver.classname'). 2) Убедитесь, что этот DB2Driver доступен как ресурс JDBC в вашем WebSphere Admin консоль и/или 3) Убедитесь, что драйвер DB2 .jar настроен в вашем pom.xml (если вы используете Maven). – paulsm4

+0

Спасибо за ваши ответы. Мы не используем Maven или Hibernate, просто Spring. @BillJames Как сделать банку, содержащую класс драйвера, доступной во время тестирования? –

ответ

1

Ошибка Не удается загрузить класс драйвера JDBC 'com.ibm.db2.jcc.DB2Driver' указывает, что класс, содержащий класс, недоступен в пути пути выполнения. убедитесь, что класс, содержащий кластер, доступен.

Ref: How to Set Runtime classpath with eclipse

+0

Это полностью сработало. У меня был db2jcc.jar - путь к классу проекта, но не в пути класса JUnit (я не знал, что нам нужны две разные конфигурации). Я принимаю этот ответ, потому что это более специфично для JUnit Run Configuration. Проблема решена - время для запуска некоторых тестов JUnit. Спасибо всем. –

+0

Как правило, при запуске из eclipse путь класса сборки является частью пути класса времени выполнения, поэтому вы явно не меняете его и не настраиваете. но иногда, когда вам повезло, вам нужно :) –

0

1) Из моих заметок выше:

Это звучит, как вы, вероятно, с помощью Spring на WebSphere. Ошибка в вашем журнале - Cannot load JDBC driver class com.ibm.db2.jcc.DB2Driver.

SUGGESTIONS:

  1. след, где ваши определения JNDI (например, vitDataSource) являются определяющими их драйвер имена классов (как database.vitedoc.driver.classname)

2) Убедитесь, что этот DB2Driver доступен как JDBC ресурс в вашем WebSphere Admin пульт ... и/или ...

3) Убедитесь, что файл .jar для DB2 задан в файле pom.xml (если вы используете Maven).

2) Вы подтвердили:

"... имя класса определяется как: database.vitedoc.driver.classname = com.ibm.db2.jcc.DB2Driver"

< = Хорошо!

3) Так что теперь все, что вам нужно сделать, это:

а) Убедитесь, что у вас есть действующий db2jcc.jar:

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

б) Убедитесь, что .jar находится в Путь к классам

Если вы используете WebSphere, я предпочитаю делать это в консоли WebSphere Администратор:

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

Если это простой веб-приложение, вы можете просто добавить его в \ Lib папку вашего проекта Eclipse предоставляет:

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

0

Вот как вы можете добавить сторонние библиотеки для Eclipse.

  1. Открыть eclipse перейти к исследованию пакетов.
  2. Щелкните правой кнопкой мыши свой проект и выберите свойства проекта.
  3. Нажмите на java Путь сборки в панели слева от всплывающего окна .
  4. Выберите вкладку библиотек.
  5. Выберите «Добавить внешний файл Jar» и, используя браузер, перейдите к файлу JAR и выберите «Open», а затем «OK».
Смежные вопросы