RestController测试因h2数据库而失败

时间:2018-04-03 09:21:50

标签: spring spring-boot junit4 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

1 个答案:

答案 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")那样注释它,你应该没问题。