在Heroku上使用h2 in-mem db的测试失败

时间:2017-11-26 08:28:06

标签: java spring heroku h2

我的Spring启动应用程序有一些测试在我的本地传递正常,但在Heroku上失败:

org.h2.jdbc.JdbcSQLException: Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use (Bind failed)" [90061-196]

test个人资料的数据源配置:

@Configuration
public class TestDataSourceConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    @Profile("test")
    public DataSource testDataSource() throws URISyntaxException {
        return DataSourceBuilder.create().build();
    }
}

application-test.properties:     spring.datasource.url = JDBC:H2:MEM:tesdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE     spring.datasource.driverClassName = org.h2.Driver     spring.datasource.username = SA     spring.datasource.password =

spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

我知道Heroku不支持h2,但这不应该是这种情况因为应用程序本身会带来数据库,对吗?

也许我错了,并没有因为Heroku不支持h2而失败,但我没有任何其他进程在端口8082上侦听(至少我知道并从内部启动)我的应用程序)

2 个答案:

答案 0 :(得分:3)

这是因为在eclipse和Heroku上运行测试之间存在差异。 Eclipse分别运行每个测试,这意味着它运行整个应用程序的新开始运行每个测试。但Heroku依次在一台机器上运行所有测试类。因此,我必须在每个测试类运行完毕后终止h2服务器:

@AfterClass
public static void tearDown() throws SQLException {
    webServer.stop();
}

答案 1 :(得分:2)

Heroku将传递端口号,您需要使用名为PORT的环境变量。

要使用此变量设置应用程序端口,您必须在 application-test.properties 中添加一行:

server.port=${PORT:8082}

application-test.yml

server:
     port: ${PORT:8082}

如果未设置PORT(例如在您的本地环境中),则会使用默认8082

这应该涵盖java.net.BindException例外。