読者です 読者をやめる 読者になる 読者になる

ユニットテスト用DB(derby)を簡単に作成する方法

buri

以前derbyのコンソールで登録するのが面倒なので、良い方法はないものかと悩んでいたときにつくってみたものです。

pom.xmlsql-maven-pluginを使ってSQLを登録するようにplugin記述を追加してみました。

      <!-- 
       [SQLを簡単にderbyに流すための暫定手段(by nobeans)]
        下のコメントをはずして、mvn process-test-resourcesを実行するとdb/buri配下にderbyのデータが
        作成されます。既存のデータがあっても大丈夫だと思います。
        ただし、mvn testとして一気にユニットテストまで通して実行しようとするとテスト結果がNGに
        なってしまいます。原因はまだよくわかっていません。
        データの投入が完了したら、もう一度コメントアウトしてから、mvn testを実行してください。
        mvn process-test-resourcesの実行でいろいろSQLエラーがでるかもしれませんが、
        気にしないで(?) mvn testを実行してみてください。全テストが通れば問題はありません。
        -->
<!--
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sql-maven-plugin</artifactId>
        <dependencies>
          <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.1.2.1</version>
            <scope>test</scope>
          </dependency>
        </dependencies>
        <configuration>
          <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
          <url>jdbc:derby:db/buri;create=true</url>
          <autocommit>true</autocommit>
        </configuration>
        <executions>
          <execution>
            <id>drop-db</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <fileset>
                <basedir>${basedir}</basedir>
                <includes>
                  <include>db/dropdb_derby.sql</include>
                  <include>db/example_drop_derby.sql</include>
                  <include>db/unitTestTable_drop_derby.sql</include>
                </includes>
              </fileset>
              <onError>continue</onError>
              <skip>false</skip>
            </configuration>
          </execution>
          <execution>
            <id>create-db</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <fileset>
                <basedir>${basedir}</basedir>
                <includes>
                  <include>db/createdb_derby.sql</include>
                  <include>db/example_derby.sql</include>
                  <include>db/unitTestTable_derby.sql</include>
                </includes>
              </fileset>
              <onError>continue</onError>
              <skip>false</skip>
            </configuration>
          </execution>
        </executions>
      </plugin>
-->

コメントにも書きましたが、mvn testとやってprocess-test-resourcesフェーズからtestフェーズまで通して実行したときに、テスト結果がNGとなってしまいます。
どうも、process-test-resourcesフェーズで作成したderby-DBに対して、testフェーズでうまくアクセスしにいけないようです。

↓こんなエラー。

org.seasar.framework.exception.SQLRuntimeException: [ESSR0071]SQLで例外(ErrorCode=40000, SQLState=XJ040)が発生しました。理由はSQL Exception: データベース 'db/buri' を始動できません。詳しくは、次の例外を参照してください。
	at org.seasar.extension.jdbc.util.DataSourceUtil.getConnection(DataSourceUtil.java:38)
	at org.seasar.dao.impl.DaoMetaDataImpl.initialize(DaoMetaDataImpl.java:135)
	at org.seasar.dao.impl.DaoMetaDataFactoryImpl.createDaoMetaData(DaoMetaDataFactoryImpl.java:120)
	at org.seasar.dao.impl.DaoMetaDataFactoryImpl.getDaoMetaData(DaoMetaDataFactoryImpl.java:102)
〜(省略)〜
Caused by: SQL Exception: データベース 'db/buri' を始動できません。詳しくは、次の例外を参照してください。
	at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown Source)
	at org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Unknown Source)
	at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:207)
〜(省略)〜

というわけで、動作として不安があるもののちょっといつもとちがうところでぶりの開発環境をつくりたい!というときに大変便利なので、とりあえずコメントアウトした状態でコミットしてみました。

あと、SQLファイルですがpostgresql用をみならって、derby用のもdrop専用ファイルとcreate専用ファイルに分けてみました。
両方とも、リビジョン187でコミット済みです(escafeの方に)。

どなたか、上の問題の解決方法を知っているとか、もっと良い方法があるとか、pom.xmlの書き方がやばいよとかあったらコメントお願いします。m(_ _)m