0

sql-maven-plugin を使用して、単体テスト用にインメモリ hsql データベースをセットアップしています

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>sql-maven-plugin</artifactId>
            <version>1.5</version>
            <dependencies>
                <dependency>
                    <groupId>org.hsqldb</groupId>
                    <artifactId>hsqldb</artifactId>
                    <version>2.2.8</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>create-db</id>
                    <phase>process-test-resources</phase>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                    <configuration>
                        <driver>org.hsqldb.jdbcDriver</driver>
                        <url>jdbc:hsqldb:mem:test;shutdown=false</url>
                        <username>SA</username>
                        <password></password>
                        <autocommit>true</autocommit>
                        <srcFiles>
                            <srcFile>src/test/sql/test_db/test.sql</srcFile>
                        </srcFiles>
                    </configuration>
                </execution>
            </executions>
        </plugin>

maven:test フェーズで実行される単体テストでは、その URL でデータソースをインスタンス化しました

            org.hsqldb.jdbc.JDBCDataSource ds = new JDBCDataSource();
            ds.setUrl(URL);
            ds.setUser("sa");
            ds.setPassword("");

しかし、これには、スクリプトを介して初期化したテーブルがありません。確かに新しいjvmをフォークし、そこから開始された元のhsqlインスタンスにアクセスできないことがわかりました。hsqldb に裏打ちされたファイルを導入せずに解決策はありますか?

ありがとう

4

2 に答える 2

1

Surefire で forking をオフにしてみてください。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.16</version>
        <configuration>
          <forkCount>0</forkCount>
        </configuration>
      </plugin>

または、ユニット テスト環境で HSQL サーバーを直接インスタンス化して、フォークされた Surefire JVM 内で HSQL が生成されるようにすることもできます。

@BeforeClass
public static void oneTime() throws Exception {
    org.hsqldb.Server.main(new String[]{});
}

@AfterClass
public static void oneTime() throws Exception {
    BasicDataSource dataSource = ... // get your data source
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.execute("SHUTDOWN");
}

テスト クラスの後に HSQL をシャットダウンしないと、テスト クラスごとに新しい db サーバーを生成しようとして、「Port already in use」タイプのエラーが発生します。

または、Hibernate や DbUnit などのフレームワークを使用することもできます。

于 2013-10-04T20:49:45.823 に答える