Как заставить интеграционные тесты setUp () манипулировать данными HSQL в БД в памяти, работающей во встроенном контейнере Jetty? - PullRequest
4 голосов
/ 11 января 2012

Я пытаюсь запустить интеграционные тесты для процесса веб-службы REST, который запускается во встроенном контейнере для молнии на этапе тестирования интеграции maven.Это все работает.

Я хочу настроить сервер на использование базы данных HSQL в памяти таким образом, чтобы каждый тест JUnit мог настраивать базу данных (создавать таблицы, вставлять записи) и разбирать ее (удалять записи).).

Контекст приложения процесса веб-служб определяет следующий источник данных:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="#{applicationProperties['jdbc.driver.class.name']}" />
    <property name="url" value="#{applicationProperties['jdbc.url']}" />
    <property name="username" value="#{applicationProperties['db.user']}" />
    <property name="password" value="#{applicationProperties['db.pass']}" />
</bean>

Свойства:

jdbc.driver.class.name=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:mem:mytestdb
db.user=sa
db.pass=

При выполнении модульных тестов (для которых не требовалосьна встроенном контейнере Jetty) эта установка работала нормально.Каждый модульный тест создавал базу данных и вставлял записи следующим образом:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
public class TestBase {

    @Autowired
    protected ApplicationContext context;

    ...

    @Before
    public void setUp() {
        DriverManagerDataSource ds = (DriverManagerDataSource) context.getBean("dataSource");
        // Create tables
        // Insert records
    }
}

В моих интеграционных тестах это не работает - очевидно, потому что источник данных, который создается при запуске моего сервера в Jetty, недоступенмой класс модульного теста для вставки / удаления данных.

Мой вопрос:

  • Как я могу настроить HSQL во встроенном контейнере Jetty, чтобы мой модульный тестМетод setUp () может манипулировать данными?

1 Ответ

0 голосов
/ 10 февраля 2012

Публикация моего собственного решения на случай, если оно пригодится кому-то еще в будущем.

Хорошо, так что я не решил это так, как надеялся.

Я не смог найти способ, чтобы мои интеграционные тесты вставляли данные в базу данных HSQL в памяти, которая работала на сервере.

Поэтому вместо того, чтобы решить эту проблему таким образом, у меня был серверСам просто загрузи данные при запуске.В src / test я добавил сервлет инициализации БД, который запускает HSQL DB в памяти, а затем выполняет операторы вставки для загрузки тестовых данных.Затем я скопировал файл web.xml из src / main / webapp в src / test / webapp (мне не нравилось это делать) и добавил этот тестовый сервлет для загрузки при запуске.

Итак, тестысами по себе не вставляют данные между тестами, но они вызывают метод doget () в моем новом тестовом сервлете, чтобы сказать ему обновить базу данных в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...