Как мне настроить приложение загрузки Spring так, чтобы при выполнении модульных тестов он использовал базу данных в памяти, такую как H2/HSQL, но когда я запускаю приложение загрузки Spring, он будет использовать производственную базу данных [Postgre/MySQL ]?
Настройте конкретную базу данных памяти для целей тестирования в Spring
Ответ 1
Для этого могут использоваться профилиSpring. Это будет особый способ:
Имеют файлы свойств среды:
application.properties
spring.profiles.active: dev
application-dev.properties
spring.jpa.database: MYSQL
spring.jpa.hibernate.ddl-auto: update
spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password
application-test.properties
spring.jpa.database: HSQL
Иметь драйверы MySQL и H2 в pom.xml
, например:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
И последнее, но не менее важное: аннотировать тестовые классы с помощью @ActiveProfiles("test")
.
Ответ 2
Другой подход состоит в том, чтобы добавить к вам тестовый класс аннотацию @AutoConfigureTestDatabase
.
Мои тесты обычно выглядят так:
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class MyRepositoryTest {
@Autowired
MyRepository repository;
@Test
public void test() throws Exception {
// Tests...
}
}
Ответ 3
@Sanjay имеет один способ выразить это, но я нахожу это запутанным. У вас также может быть только профиль production
, который вы включаете, когда находитесь в процессе производства, например:
spring.jpa.hibernate.ddl-auto: update
spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password
И не указывайте ничего другого. Если вы добавите встроенную базу данных в область test
, она будет доступна в ваших тестах. Если вы запускаете свои тесты с профилем по умолчанию (без каких-либо настроек), он не сможет найти информацию о базе данных (поскольку они хранятся в профиле production
). В этом случае он попытается найти встроенную базу данных и запустить ее для вас. Если по какой-то причине вам понадобится больше настроек, для них может быть application-test.properties
(вам нужно добавить ActiveProfiles("test")
в свой тест (ы).
Ответ 4
Простое решение при построении с помощью maven
: просто поместите файл application.properties
в src/test/resources
и отредактируйте, если это необходимо для тестирования.
Механизм Spring (Boot) Profile - довольно мощный инструмент, который в области видимости выходит за рамки "замены параметров между временем тестирования и временем выполнения". Хотя, очевидно, как показано, он может сделать это также:)
Ответ 5
Самое простое решение:
1) в src/main/resources есть application.properties (производственный конфиг):
spring.datasource.url=jdbc:mysql://localhost:3306/somedb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
и application-test.properties с настройкой HSQL, например:
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.database = HSQL
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect
spring.datasource.driverClassName = org.hsqldb.jdbcDriver
spring.datasource.url= jdbc:hsqldb:mem:scratchdb
spring.datasource.username = sa
spring.datasource.password =
2) Добавьте зависимость HSQL в pom.xml, если у вас ее еще нет.
3) Аннотируйте свой тестовый класс с помощью @ActiveProfiles ("test").
Работал как шарм в моем случае.
Ответ 6
С магией @SpringBootTest вам просто нужно выполнить следующие два изменения.
- Добавить тестовую зависимость h2 в pom.xml
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>
- Использовать @AutoConfigureTestDatabase
@RunWith(SpringRunner.class) @SpringBootTest(classes = MySpringBootApplication.class) @AutoConfigureTestDatabase public class SpringBootTest{ @Autowired private RequestRepository requestRepository; }
Теперь все весенние jpa bean/репозитории, используемые в тесте, будут использовать h2 в качестве резервной базы данных.
2019-04-26 13: 13: 34.198 ИНФОРМАЦИЯ 28627 --- [main] beddedDataSourceBeanFactoryPostProcessor: замена bean-компонента DataSource DataSource на встроенную версию
2019-04-26 13: 13: 34.199 INFO 28627 --- [main] osbfsDefaultListableBeanFactory: переопределение определения bean-компонента для bean 'dataSource'
2019-04-26 13: 13: 36.194 INFO 28627 --- [main] osjdeEmbeddedDatabaseFactory: запуск встроенной базы данных: url = 'jdbc: h2: mem: 2784768e-f053-4bb3-ab88-edda34956893; DB_CLOSE_DELAY = -1; DB_CLITE_ = false ', username =' sa '
Примечание: у меня все еще есть свойства 'spring-jpa', определенные в 'application.properties', и я не использую никаких профилей. @AutoConfigureTestDatabase переопределит существующие конфигурации jpa тестовыми значениями по умолчанию AutoConfigureTestDatabase.Replace.