適切なドライバーが見つからない理由

適切なドライバーが見つからない理由

作成した DAO のユニット テスト (JUnit) を行おうとしています。フレームワークとして Spring を使用しており、DAO (JdbcPackageDAO) は SimpleJdbcDaoSupport を拡張しています。テスト クラス (JdbcPackageDAOTest) は AbstractTransactionalDataSourceSpringContextTests を拡張しています。configLocations を次のようにオーバーライドしました。

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

私の test-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: トランザクションの JDBC 接続を開けませんでした。ネストされた例外は java.sql.SQLException: jdbc:hsqldb:hsql://localhost に適したドライバーが見つかりません
    org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) で
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) で
    org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) で
    org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) で
    org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) で
    junit.framework.TestCase.runBare(TestCase.java:128) で
    org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) で
    junit.framework.TestResult$1.protect(TestResult.java:106) で
    junit.framework.TestResult.runProtected(TestResult.java:124) で
    junit.framework.TestResult.run(TestResult.java:109) で
    junit.framework.TestCase.run(TestCase.java:120) で
    junit.framework.TestSuite.runTest(TestSuite.java:230) で
    junit.framework.TestSuite.run(TestSuite.java:225) で
    org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) で
    org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) で
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) で
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) で
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) で
    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) で
原因: java.sql.SQLException: jdbc:hsqldb:hsql://localhost に適したドライバーが見つかりません
    java.sql.DriverManager.getConnection(不明なソース)
    java.sql.DriverManager.getConnection(不明なソース)
    org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) で
    org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) で
    org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) で
    org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) で
    org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) で
    ... 18件以上

ベストアンサー1

HSQLDBを登録するには、jdbcDriverクラスにアクセスする必要があります。これは次のように実行できます。

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

これは、jdbcDriver クラスの静的初期化をトリガーします。

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

おすすめ記事