2
votes

I am attempting to create some integration tests for my Spring web app using Jetty accessing a local HSQL database. The goal: run the tests using Selenium (or similar), mock/stub out all external systems, and setup a HSQL database to hit instead of our shared Oracle database. The tests are started during a maven build (the integration-test phase). The database is initialized by Spring's "jdbc:initialize-database", and is registered as a JNDI datasource in Jetty.

After days of trying different configuration, I have finally gotten to the point where the database is created, initialized, and I think registered as a Jetty resource, but when the test cases run, it just hangs; I think because it is waiting for the database to become available.

Maven configuration

<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2-plugin</artifactId>
  <version>1.3.3</version>
  <executions>
    <execution>
      <id>start</id>
      <phase>pre-integration-test</phase>
      <goals>
        <goal>start</goal>
      </goals>
    </execution>
    <execution>
      <id>stop</id>
      <phase>post-integration-test</phase>
      <goals>
        <goal>stop</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <container>
      <containerId>jetty7x</containerId>
      <dependencies>
        <dependency>
          <groupId>org.hsqldb</groupId>
          <artifactId>hsqldb</artifactId>
        </dependency>
        <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
        </dependency>
      </dependencies>
    </container>
    <configuration>
      <home>${project.build.directory}/cargo/configurations/jetty7x</home>
      <properties>
        <cargo.jetty.createContextXml>false</cargo.jetty.createContextXml>
        <cargo.datasource.datasource>
          cargo.datasource.url=jdbc:hsqldb:file:../../../myDB|
          cargo.datasource.driver=org.hsqldb.jdbcDriver|
          cargo.datasource.username=sa|
          cargo.datasource.password=|
          cargo.datasource.type=javax.sql.DataSource|
          cargo.datasource.jndi=jdbc/myDataSource
        </cargo.datasource.datasource>
      </properties>
    </configuration>
    <deployables>
      <deployable>
        <location>target/myApp</location>
        <properties>
          <context>myApp</context>
        </properties>
      </deployable>
    </deployables>
  </configuration>
 </plugin>

Spring configuration

<bean id="localDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="org.hsqldb.jdbcDriver"/>
    <property name="jdbcUrl" value="jdbc:hsqldb:file:target/myDB"/>
    <property name="user" value="sa"/>
    <property name="password" value=""/>
</bean>

 <jdbc:initialize-database data-source="mydataSource" ignore-failures="DROPS"> 
    <jdbc:script location="classpath:/sql-scripts/schema/create-schema.sql"/> 
    <jdbc:script location="classpath:/sql-scripts/schema/create-tables.sql"/> 
    <jdbc:script location="classpath:/sql-scripts/testdata/data-load.sql"/> 
</jdbc:initialize-database> 

I am probably missing something, I tried to piece together the configuration through advice from many other posts. Any help would be appreciated.

1

1 Answers

1
votes

The recommended method of using HSQLDB for tests, especially complex test setups, is running a Server.

Initially, you start an HSQLDB server using the shell, independently of your test setup. Use the Server property server.silent=false to see immediately the connections and statements on the console.

After some progress has been made, you can customize the server settings. See the Guide:

http://www.hsqldb.org/doc/2.0/guide/listeners-chapt.html

And a summary of different options for testing:

http://www.hsqldb.org/doc/2.0/guide/deployment-chapt.html#dec_app_dev_testing

You may need to use the MVCC transaction model. This reduces the locks and sometimes avoids the connections hanging as a result of on one waiting for the other to commit.