Предположим, что я хочу создать и использовать базу данных H2 для моих интеграционных тестов.
У знатока есть команда для запущения тестов: mvn test
.
Существует ли способ сказать знатоку запускать сервер базы данных H2 для тестов и останавливать его, когда он сделан?
Я воображаю эту работу подобной тому, как я могу выполнить кота через команду Maven (mvn tomcat:run
).
Извините, если этот вопрос бессмыслен, я все еще переношу голову вокруг новых понятий.
Я смог заставить его работать без использования внешнего сервера, просто добавив зависимость в H2 через Maven, а затем используя этот боб:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:file:h2\db"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
Опять же, это потребовало, чтобы я использовал БД на основе файлов, а не в памяти. Но это помогает.
В моем проекте для модульного тестирования я попросил Spring обработать создание и инициализацию этой базы данных. Как указано в документации H2 , вы можете создать для этого bean-компонент:
<bean id = "org.h2.tools.Server"
class="org.h2.tools.Server"
factory-method="createTcpServer"
init-method="start"
destroy-method="stop">
<constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,8043" />
</bean>
Вам просто нужно запустить контекст Spring с этой конфигурацией, когда вы запускаете свои модульные тесты.
вы можете создать 2 небольших класса с основными методами, запускающими и останавливающими базу данных. идея состоит в том, чтобы запустить класс StartServer перед запуском интеграционных тестов, а затем класс StopServer после выполнения тестов.
вы должны сделать то же самое для своего сервера БД, как описано где-то в этом документе (описание предназначено для запуска и остановки Jetty в интеграционных тестах)
в вашем pom.xml вы должны определить maven- плагин exec для выполнения цели exec: java и создания 2 выполнения (1 для вызова StartServer и 1 для StopServer):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<!-- start server before integration tests -->
<id>start</id>
<phase>pre-integration-test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.foo.StartServer</mainClass>
</configuration>
</execution>
<execution>
<!-- stop server after integration tests -->
<id>stop</id>
<phase>post-integration-test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.foo.StopServer</mainClass>
</configuration>
</execution>
</executions>
</plugin>
надеюсь, что это то, что вы хотите
Поскольку H2 не предоставляет подключаемый модуль Maven, вы должны запустить его с помощью maven-antrun-plugin. Напишите код для запуска и остановки движка h2 в задаче ant и вызывайте его, когда ваш интеграционный тест запускается и останавливается.
См. Подробности о http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing