Использовать встроенную базу данных для тестирования в spring boot

у меня есть приложение spring boot, у него есть пара @Entity классы @RepositoryRestResource интерфейсы repositort для них. Теперь я хочу написать несколько тестов, где я могу проверить, что я могу добавить новую запись в свою базу данных, используя эти репозитории, но я не хочу использовать мою настроенную базу данных MySQL для нее, но вместо этого я хочу использовать некоторую встроенную БД, такую как H2. На данный момент у меня есть application.properties файл, который выглядит так:

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=qwerty123

вопрос: как настроить мое приложение для использования другой БД для тестов? У меня нет xml в моем проекте, все основано на аннотациях. Я попытался определить @Configuration класс @Bean создать DataSource и затем использовать его с @ContextConfiguration аннотация в тестовом классе, но в ней говорится, что он не может загружать контекст.

3 ответов


если вы используете проект Maven, вы можете добавить в своем src/test/resources, например, со следующим содержанием.

# Create DDL
spring.jpa.hibernate.ddl-auto=create

# H2 in local file system allowing other simultaneous connections
spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE

кроме того, вам нужно включить H2 в качестве зависимости (pom.xml):

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>1.4.193</version>
</dependency>

вам нужно будет использовать профили весны - https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-set-active-spring-profiles

вы определите активный профиль, используя " spring.профили.active = development", а затем включить H2 в свой профиль разработки.

в примерах используется YAML, но они также работают в стандартных файлах свойств.


Spring Boot предоставляет 2 волшебные аннотации, связанные с автоконфигурациями JPA для тестов:@DataJpaTest и @AutoConfigureTestDatabase. Документация javadoc говорит:

по умолчанию тесты, аннотированные @DataJpaTest, будут использовать встроенный база данных в памяти (замена любой явной или обычно автоматически настроенной Источник данных). Аннотацию @AutoConfigureTestDatabase можно использовать для переопределить эти параметры.

если вы хотите загрузить полную конфигурацию приложения, но использовать встроенная база данных, вы должны рассмотреть @SpringBootTest в сочетании с @AutoConfigureTestDatabase, а не с этой аннотацией.

Итак, единственное, что вам абсолютно нужно, это зависимость в вашем файле pom:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>

вот и все. Тем не менее, spring boot spec также имеет 2 полезных предостережения:

вам не нужно предоставлять URL-адреса подключения. Вам нужно только включить создайте зависимость от встроенной базы данных, которую вы хотите использовать. Если вы используете эту функцию в своих тестах, вы можете заметить, что одна и та же база данных повторно используется всем набором тестов независимо от количество используемых контекстов приложений. Если вы хотите убедиться чтобы каждый контекст имел отдельную встроенную базу данных, необходимо задать весна.источник.generate-unique-name to true.

и еще один:

если по какой-либо причине вы настраиваете URL-адрес соединения для встроенная база данных, принимать позаботьтесь о том, чтобы база данных была автоматической выключение отключено. Если вы используете H2, вы должны использовать DB_CLOSE_ON_EXIT=FALSE для этого. Если вы используете HSQLDB, вы должны обеспечить это shutdown=true не используется. Отключение автоматической базы данных shutdown lets Spring Boot control при закрытии базы данных, тем самым обеспечение того, что это произойдет, как только доступ к базе данных больше не будет нужно.

Это почти все, что вам нужно знать о Spring Boot и встроенный DBs. Я не вижу абсолютно никаких причин использовать область зависимости, кроме test, Если вы на самом деле намеренно не настраиваете встроенную БД для среды выполнения приложения. Верьте или нет H2 jar в одиночку занимает 1,8 м внутри вашего жира банку. В мире на зернистый микрослужб, быстрое и лямбда-функции это важно, что вы положили в ваших приложениях.

Я бы также рекомендовал проверить параметры в @AutoConfigureTestDatabase. Я использую его с @SpringBootTest, но он может также использоваться с некоторыми другими аннотациями, а именно @DataJpaTest, упомянутыми выше: enter image description here