2008-10-02 117 views
18

我试图单元测试(JUnit)我创建的DAO。我使用Spring作为我的框架,我的DAO(JdbcPackageDAO)扩展了SimpleJdbcDaoSupport。测试类(JdbcPackageDAOTest)扩展了AbstractTransactionalDataSourceSpringContextTests。我已经覆盖了configLocations如下:找不到合适的驱动程序的原因

protected String[] getConfigLocations(){ 
    return new String[] {"classpath:company/dc/test-context.xml"}; 
} 

我测试context.xml文件定义如下:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="dataPackageDao" class="company.data.dao.JdbcPackageDAO"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
     <property name="url" value="jdbc:hsqldb:hsql://localhost"/> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
    </bean> 

    <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>company/data/dao/jdbc.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
</beans> 

我使用HSQL作为我的后端,它在单机模式下的运行。我选择的IDE是eclipse。当我将该类作为JUnit测试运行时,这是我的错误(如下所示)。我不知道为什么会发生。根据Eclipse,hsql.jar位于我的构建路径中。

 
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost 
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) 
    at org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) 
    at org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) 
    at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) 
    at junit.framework.TestCase.runBare(TestCase.java:128) 
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) 
    at junit.framework.TestResult$1.protect(TestResult.java:106) 
    at junit.framework.TestResult.runProtected(TestResult.java:124) 
    at junit.framework.TestResult.run(TestResult.java:109) 
    at junit.framework.TestCase.run(TestCase.java:120) 
    at junit.framework.TestSuite.runTest(TestSuite.java:230) 
    at junit.framework.TestSuite.run(TestSuite.java:225) 
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
Caused by: java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) 
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) 
    ... 18 more 

回答

2

它看起来就像你不指定连接到,应该去像

jdbc:hsqldb:hsql://serverName:port/DBname 
1

你可以导入驱动程序(org.hsqldb.jdbcDriver)到源的一个数据库名称文件? (为了测试这个类实际上在你的类路径中)。

如果你不能导入它,那么你可以尝试在你的构建路径中包括hsqldb.jar

+0

我可以导入jdbcDriver;这意味着hsqldb在我的构建路径上。 – IaCoder 2008-10-02 03:04:51

0

这可能是

hsql://localhost

不能解析到一个文件中。看看这里的示例程序:

Sample HSQLDB program

看看你是否可以得到工作,然后再看看你可以采取的配置信息,并在Spring bean配置使用它。

祝你好运!

0

我认为你的HSQL URL是错误的。它还应包括数据库名,

所以像

jdbc:hsqldb:hsql://localhost/mydatabase 

如果MyDatabase的是您的DB(文件)的名称。不包括这可以(我不知道这是否是这种情况)混淆了URL的解析,这可能导致DriverManagerDS认为你的驱动程序不适合(它被发现,但它认为它不是一个好东西一个)

3

好吧,这是解决方案。大多数人都提出了非常好的观点,但没有一个能解决问题(感谢帮助)。这是我找到的解决方案。从.../WEB-INF/lib目录

  1. 移动罐子PROJECT_ROOT/lib目录
  2. Alter在Eclipse构建路径以反映这种变化。
  3. 清理并重建我的项目。
  4. 跑了junit测试和BOOM它的工作!

我的猜测是它与Ganymede如何读取/ web-inf/lib文件夹中的jar有关。但是谁知道呢......它现在起作用了。

0

不知道它是否值得任何东西,但我有一个类似的问题,我得到了“java.sql.SQLException:没有找到合适的驱动程序”错误。我在研究解决方案时发现了这个线索。

我最终解决我的问题的方式是放弃使用java.sql.DriverManager来获得连接,而是建立了一个org.hsqldb.jdbc.jdbcDataSource的实例并使用它。

我的问题(我相信)的根本原因与类加载器层次结构以及JRE运行Java 5的事实有关。尽管我可以成功加载jdbcDriver类,java.sql.DriverManager后面的类加载器比较高,以至于看不到我需要的hsqldb.jar。

无论如何,只要把这个笔记放在这里,以防别人碰到类似的问题。

10

“没有合适的驱动程序”通常意味着连接URL的语法不正确。

3

如果你看看你的原始连接字符串:

<property name="url" value="jdbc:hsqldb:hsql://localhost"/> 

高超声速文档建议你本地主机后缺少一个别名:

http://hsqldb.org/doc/guide/ch04.html

+0

为我修好了。连接属性有问题。 – leeand00 2012-01-03 03:51:31

1

我与春天同样的问题,commons-dbcp和oracle 10g。 使用这个网址我得到了“没有合适的驱动程序”的错误:的jdbc:神谕:[email protected]:1521:基南戈普

上面的网址只是@前面缺少一个完整的结肠。纠正后,错误消失。

+0

我还发现org.springframework.jdbc.datasource.DriverManagerDataSource为相同的条件提供了更多的信息错误。 – 2009-01-09 13:03:08

27

为了让HSQLDB自己注册,你需要访问它的jdbcDriver类。您可以按照与此example相同的方式执行此操作。

Class.forName("org.hsqldb.jdbcDriver"); 

它触发jdbcDriver类,它是静态初始化:

static { 
    try { 
     DriverManager.registerDriver(new jdbcDriver()); 
    } catch (Exception e) {} 
} 
+0

他已经解决了这个问题。 – BalusC 2010-02-14 23:24:07

+7

我看到了,但我有类似的问题,解决方案如上所示。所以我想为什么不与我的同事们分享它:) – 2010-02-15 09:39:24

2

很大,我有类似的问题。所有的建议是检查jdbc url sintax

1

当尝试使用静态主方法运行数据源连接时,首先我们需要运行数据库连接。这个我们可以在eclipse中实现如下。

1)打开任何IDE(Eclipse或RAD)后打开工作区默认情况下IDE将打开在JAVA的预期。尝试从java切换到数据库,以创建数据源以及虚拟数据库连接。

2)在数据库准备中输入所有的细节,如特定模式的用户名,密码和URL。

3)然后尝试运行主要方法来访问数据库。

这将解决“serverName未定义”。

1

由于一些之前回答,这行代码解决了这个问题

Class.forName("org.hsqldb.jdbcDriver"); 

但我的应用程序在一些雄猫运行,但只在一个安装我不得不添加该代码。

0

我正面临类似的问题,令我惊讶的是问题出在Java版本中。 java.sql.DriverManager来自rt.jar无法加载我的驱动程序“COM.ibm.db2.jdbc.app.DB2Driver”。

我从jdk 5和jdk 6升级,它的工作。

0

在某些情况下检查权限(所有权)。

相关问题