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

Настройте конкретную базу данных памяти для целей тестирования в Spring

Как мне настроить приложение загрузки Spring так, чтобы при выполнении модульных тестов он использовал базу данных в памяти, такую ​​как H2/HSQL, но когда я запускаю приложение загрузки Spring, он будет использовать производственную базу данных [Postgre/MySQL ]?

4b9b3361

Ответ 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 вам просто нужно выполнить следующие два изменения.

  1. Добавить тестовую зависимость h2 в pom.xml
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>
  1. Использовать @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.