我的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
上侦听(至少我知道并从内部启动)我的应用程序)
答案 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
例外。