запуск и остановка hsqldb из модульных тестов - PullRequest
3 голосов
/ 11 июня 2010

Я пытаюсь создать интеграционные тесты, используя hsqldb в режиме памяти.На данный момент мне нужно запустить сервер hsqldb из командной строки перед запуском модульных тестов.Я хотел бы иметь возможность контролировать сервер hsqldb из моих интеграционных тестов.Кажется, я не могу заставить это все работать из кода.

Обновление:

Похоже, это работает вместе с файлом hibernate.cfg.xml в classpath:

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

, они выполняются правильно, и нет никаких исключений.Я что-то упускаю из-за зависимости?Я сгенерировал проект eclipse, используя

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, выполнил очистку, заново создал мой .clp. Eclipse, используя maven, и обновил проект в eclipse.Я думаю, что, возможно, у меня что-то осталось от предыдущей конфигурации, которая скинула это.

Спасибо за помощь всем!

Ответы [ 6 ]

6 голосов
/ 11 июня 2010

Я использую следующую конфигурацию (непосредственно навеянную учебником Hibernate ) без каких-либо проблем:

<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 голосов
/ 27 августа 2012

В вашем методе выключения просто сделайте

Statement st = conn.createStatement();
st.execute("SHUTDOWN");
conn.close();
2 голосов
/ 11 июня 2010

Попробуйте добавить это к URL-адресу jdbc:

;ifexists=true;shutdown=true;
0 голосов
/ 13 июня 2016

Может быть, это может помочь запустить HSQL в режиме сервера в модульном тесте, но в той же JVM.Пример кода запускает org.hsqldb.server.WebServer (т.е. порт 80), но вы можете использовать org.hsqldb.server.Server.Вы можете вызвать setPort на любом из них, чтобы переопределить порт по умолчанию.

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

0 голосов
/ 10 января 2014

проверьте мой плагин hsqldb maven: https://github.com/avianey/hsqldb-maven-plugin

Вы можете просто запустить / остановить его как jetty-maven-plugin или tomee-maven-plugin для ваших тестов:

<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>
0 голосов
/ 11 июня 2010

А как насчет запуска сервера через 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)

...