Использовать встроенную базу данных для тестирования в 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, упомянутыми выше: