我正在尝试使用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
答案 0 :(得分:1)
实际上,您不需要为嵌入式h2数据库设置任何属性,因为引导为您配置(另外,我认为您应该省略MODE=Oracle
标志)。这就是我的所作所为:
将以下dependendy放入.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")
那样注释它,你应该没问题。