Как использовать сценарии инициализации базы данных Spring embedded на этапе тестирования интеграции?

Я могу использовать Spring для создания и инициализации встроенных баз данных программно:

@Before
public void setUp() {
    database = new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("schema.sql")
            .addScript("init.sql")
            .build();
    ....
}

или через конфигурацию Spring:

<jdbc:initialize-database data-source="dataSource">
  <jdbc:script location="classpath:schema.sql"/>
  <jdbc:script location="classpath:init.sql"/>
</jdbc:initialize-database>

вот мои скрипты schema.sql и init.sql хранятся в директории src/test/resources. Поэтому, если тесты с использованием встроенного databse выполняются с:

mvn test

затем файлы, находясь в src/test/resources доступны, и все нормально.

но теперь предположим, что я хочу вместо этого использовать встроенную базу данных вместе со встроенным веб-сервером (Jetty или embedded Tomcat) в интеграционного тестирования, Котор побежали через

mvn integration-test

теперь на этом позднем этапе я хочу сделать почти сквозной тест, который при попадании определенных URL-адресов для веб-службы возвращает ожидаемые HTTP-ответы, предполагая определенные данные во встроенной базе данных. Но на данный момент война, развернутая во встроенном веб-сервере, не имеет файлов из src/test/resources таким образом, мои сценарии инициализации отсутствуют, и я получаю ошибка

вызвано: java.Ио.FileNotFoundException: ресурс пути к классу [схема.sql] не может быть открыт, потому что он не существует

теперь все будет работа, если я помещаю скрипты в src/main/resources но эти скрипты предназначены только для заполнения встроенной базы данных для тестирование и не принадлежат в файле войну. Кто-нибудь знает, как настроить интеграционный тест, чтобы база данных emedded можно ли использовать, не загрязняя фактический файл войны, который будет развернут?

Я надеялся, что встроенная инициализация базы данных Spring может использовать что-то другое, чем файл. Я подумал о JNDI, но это, похоже, потребует загрязнения сети.xml-файл с определением ресурса для тестовых данных, который (снова) появится в развертываемой войне. Или, может быть, есть варианты использования груза? Некоторые программные трюки с Spring, которые я не знаю?

1 ответов


вы должны быть в состоянии сделать это:

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="file:///${project.basedir}/src/test/resources/schema.sql"/>
    <jdbc:script location="file:///${project.basedir}/src/test/resources/init.sql"/>
</jdbc:initialize-database>