Тест RestController не работает с базой данных h2

Я пытаюсь запустить тест своего RestController в моем приложении Spring boot с базой данных h2. Вот код:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
public class E2E_EconomicOperatorAPIControllerTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test public void test_newEconomicOperator() {
     //staff
     }
}

Но когда я запускаю его, я получаю эту ошибку:

2018-04-03 12:16:57.084  WARN 14332 --- [       Thread-7] o.s.b.f.support.DisposableBeanAdapter    : Invocation of destroy method failed on bean with name 'inMemoryDatabaseShutdownExecutor': org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-196]

А вот и мой файл свойств:

spring.datasource.url=jdbc:h2:mem:testdb;MODE=Oracle;DB_CLOSE_DELAY=-1

logging.level.org.gso.admin=DEBUG
logging.level.gso.gd.client=INFO
logging.level.org.springframework.web.client=WARN
logging.level.org.springframework=WARN
logging.level.org.thymeleaf=WARN
logging.level.root=WARN

Попробуйте обновить URL-адрес источника данных, например, что-то вроде: jdbc: h2: mem: testdb; DB_CLOSE_ON_EXIT = FALSE, он появляется без предложения при выходе закрыть база данных h2 автоматически отключается

ConsultingEasy 03.04.2018 11:27

Да, я видел этот ответ в другом вопросе о переполнении стека, но напрасно. Уже добавлен в мой файл свойств

Houssem Badri 03.04.2018 11:30

Это решает проблему?

ConsultingEasy 03.04.2018 11:37
0
3
1 422
1

Ответы 1

На самом деле вам не нужно устанавливать какое-либо свойство для встроенной базы данных h2, поскольку загрузка настраивает это за вас (кроме того, я думаю, вам следует опустить флаг MODE=Oracle). Вот что я сделал: Поместите следующую зависимость в ваш .pom:

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

Обратите внимание на объем. Это загрузит зависимость от вашего пути к классам во время теста (и ничего больше). Затем вы должны убедиться, что у вас есть файл application.properties для каждой среды, в котором вы устанавливаете базу данных всякий раз, когда вам нужна настоящая.

В качестве примера из моего приложения:

application-dev.properties: (примечание: я хотел настоящую базу данных для разработчика, поэтому я вставил простгрес ...)

spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=validate
spring.database.driverClassname=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://192.168.1.100:5432/winecellar
spring.datasource.username=winecellar
spring.datasource.password=winecellar

application-test.properties:

spring.jpa.database=H2
spring.jpa.show-sql=true 
spring.jpa.hibernate.ddl-auto=none
spring.database.driverClassname=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.username=sa
spring.datasource.password=

И у меня есть аналогичный файл для производственных настроек (также с использованием postgres ...)

Затем, если вы аннотируете его, как это было с @ActiveProfiles("test"), все будет в порядке.

Я работаю с H2 в режиме разработки также локально, поэтому его область действия в моем pom - это `` среда выполнения '', поэтому она доступна также для тестовой области (согласно документации)

Houssem Badri 03.04.2018 12:12

Должно быть хорошо. Просто измените файл свойств соответствующим образом

thomi 03.04.2018 12:14

Да, все уже исправлено, и мой проект уже работает нормально, но я впервые пробовал работать с resttemplate. Кстати, я не получаю эту ошибку при тестировании моей службы

Houssem Badri 03.04.2018 12:16

Другие вопросы по теме