Подтвердить что ты не робот

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

Я могу использовать 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. Поэтому, если тесты, использующие встроенную базу данных, выполняются с помощью:

mvn test

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

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

mvn integration-test

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

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

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

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

4b9b3361

Ответ 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>