代码之家  ›  专栏  ›  技术社区  ›  Casey

从单元测试启动和停止hsqldb

  •  3
  • Casey  · 技术社区  · 14 年前

    我尝试在内存模式下使用hsqldb创建集成测试。目前,在运行单元测试之前,我必须从命令行启动hsqldb服务器。我希望能够通过集成测试控制hsqldb服务器。我似乎无法从代码中解决所有问题。

    更新:

    这似乎与类路径中的hibernate.cfg.xml文件一起工作:

    org.hsqldb.Server.main(new String[]{});
    

    在我的hibernate.cfg.xml文件中:

    <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
    <property name="connection.url">jdbc:hsqldb:mem:ww</property>
    <property name="connection.username">sa</property>
    <property name="connection.password"></property>
    <property name="connection.pool_size">1</property>
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    <property name="current_session_context_class">thread</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hbm2ddl.auto">update</property>
    

    更新 这似乎只是在Eclipse中使用JUnit和内置测试运行程序运行单元测试时的一个问题。如果我跑

     mvn test
    

    它们执行正确,没有例外。就依赖性而言,我是否遗漏了一些东西?我已经使用

    mvn eclipse:eclipse
    

    我的POM是:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.myproject</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    
    <name>myproject</name>
    
    <dependencies>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.3.2.GA</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>10.1.0.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.0</version>
        </dependency>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.8.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.4.0.GA</version>
        </dependency>
    
        <!-- Test Dependencies -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>1.8.0.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty-servlet-tester</artifactId>
            <version>6.1.24</version>
            <scope>test</scope>
        </dependency>
    
    
        <!-- Provided -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>servlet-api</artifactId>
            <version>6.0.26</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>jsp-api</artifactId>
            <version>6.0.26</version>
        </dependency>
    
    </dependencies>
    
    <build>
        <finalName>ww_main</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
    
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    

    更新 好吧,不知道到底出了什么问题,但我似乎已经解决了。我删除了hsqldb创建的所有文件,以及maven目标文件夹中创建的所有文件,清理并重新创建了我的eclipse.project,使用maven刷新了eclipse中的项目。我想我可能是因为之前的配置中有一些遗留的东西而把它扔掉了。

    谢谢大家的帮助!

    6 回复  |  直到 14 年前
        1
  •  6
  •   Pascal Thivent    14 年前

    我使用以下配置(直接受 Hibernate tutorial )没问题:

    <hibernate-configuration>
      <session-factory>
    
        <!-- Database connection settings -->
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
        <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:foobar"/>
        <property name="hibernate.connection.username" value="sa"/>
        <property name="hibernate.connection.password" value=""/>
    
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>
    
        <!-- SQL dialect -->
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    
        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
    
        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
    
        <!-- Drop and re-create the database schema on startup -->
        <property name="hibernate.hbm2ddl.auto" value="update"/>
    
        <mapping resource="..."/>
    
      </session-factory>
    </hibernate-configuration>
    

    使用内存中的hsqldb时,不需要显式启动任何内容。只使用 mem: 协议和内存数据库将从JDBC启动。

    也见

        2
  •  2
  •   Nathan Hughes    14 年前

    尝试将此附加到JDBC URL:

    ;ifexists=true;shutdown=true;
    
        3
  •  2
  •   David Newcomb    8 年前

    在你的关机方法中

    Statement st = conn.createStatement();
    st.execute("SHUTDOWN");
    conn.close();
    
        4
  •  0
  •   Nikita Rybak    14 年前

    通过启动服务器怎么样 Runtime.getRuntime().exec("shell command here") ?你只需要为所有测试做一次,这样不会增加太大的延迟。

    更新
    好吧,看来你自己解决了:)

    更新2
    要在单元测试之前(或之后)执行一些代码,可以

    static class TestWrapper extends TestSetup {
        TestWrapper(TestSuite suite) {
            super(suite);
        }
    
        protected void setUp() throws Exception {
            // start db
        }
    
        protected void tearDown() throws Exception {
            // kill db
        }
    }
    

    然后,只需将测试集包装在其中: new TestWrapper(suite)

        5
  •  0
  •   avianey    10 年前

    检查我的hsqldb maven插件: https://github.com/avianey/hsqldb-maven-plugin

    您可以像jetty maven插件或tome maven插件一样启动/停止测试:

    <plugin>
    
        <!-- current version -->
        <groupId>fr.avianey.mojo</groupId>
        <artifactId>hsqldb-maven-plugin</artifactId>
        <version>1.0.0</version>
    
        <!-- 
            default value for in memory jdbc:hsqldb:hsql://localhost/xdb
            override only values you want to change
        -->
        <configuration>
            <driver>org.hsqldb.jdbcDriver</driver>
            <path>mem:test</path>
            <address>localhost</address>
            <name>xdb</name>
            <username>sa</username>
            <password></password>
            <validationQuery>SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS</validationQuery>
        </configuration>
    
        <!-- call start and stop -->
        <executions>
            <execution>
                <id>start-hsqldb</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>start</goal>
                </goals>
            </execution>
            <execution>
                <id>stop-hsqldb</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>stop</goal>
                </goals>
            </execution>
        </executions>
    
    </plugin>
    
        6
  •  0
  •   Community Egal    7 年前

    也许这有助于在单元测试中以服务器模式启动HSQL,但是在同一个JVM中。 示例代码运行org.hsqldb.server.webserver(即端口80),但您可以使用org.hsqldb.server.server。您可以调用其中一个上的setport来覆盖默认端口。

    https://stackoverflow.com/a/37784679/15789