it-roy-ru.com

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

У меня есть весеннее загрузочное приложение, у него есть пара классов @Entity и интерфейсы репозитория @RepositoryRestResource для них. Теперь я хочу написать несколько тестов, в которых я могу проверить, могу ли я добавить новую запись в свою базу данных, используя эти репозитории, но я не хочу использовать для этого настроенную базу данных 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 в тестовом классе, но он говорит, что не может загрузить контекст.

7
Leonid Bor

Если вы используете проект Maven, вы можете добавить файл application.properties в свой 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>
14
Boni García

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

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

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

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

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

Вот и все. Тем не менее, у спецификации весенней загрузки также есть 2 полезных предостережения:

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

И еще один:

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

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

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

6
yuranos87

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

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

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

2
Quinton Delpeche