Я пытаюсь запустить тест своего 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
Да, я видел этот ответ в другом вопросе о переполнении стека, но напрасно. Уже добавлен в мой файл свойств
Это решает проблему?
На самом деле вам не нужно устанавливать какое-либо свойство для встроенной базы данных 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 - это `` среда выполнения '', поэтому она доступна также для тестовой области (согласно документации)
Должно быть хорошо. Просто измените файл свойств соответствующим образом
Да, все уже исправлено, и мой проект уже работает нормально, но я впервые пробовал работать с resttemplate. Кстати, я не получаю эту ошибку при тестировании моей службы
Попробуйте обновить URL-адрес источника данных, например, что-то вроде: jdbc: h2: mem: testdb; DB_CLOSE_ON_EXIT = FALSE, он появляется без предложения при выходе закрыть база данных h2 автоматически отключается