Mamy projekt Java używający Spring i MAVEN. W tym projekcie używamy bazy danych H2 w pamięci, aby wykonać kilka testów na naszej warstwie DAO/Repository.JUnit test zaczyna się, zanim zakończy się RUNSCRIPT H2S
Po kilku testach prowadzonych, ale nie zawsze, mamy następujący błąd:
org.h2.jdbc.JdbcSQLException: Table "WEATHER" not found; SQL statement:
Jeśli wykonać sam test JUnit, to nigdy nie nie. Nie ma wzoru włączonego po pojawieniu się błędu.
Podejrzewam, że poniższe polecenie RUNSCRIPT na połączeniu URL nie zostało zakończone i po rozpoczęciu testu urządzenia, tj. Wykonanie jest wykonywane asynchronicznie.
Oto komunikat gra:
String jdbcUrl = "jdbc:h2:mem:WeatherAPI;MODE=MySQL;DB_CLOSE_ON_EXIT=TRUE;TRACE_LEVEL_SYSTEM_OUT=1;INIT=runscript from 'src/test/resources/sql/weatherapi.sql'"
Chodzi o to, że baza danych zostanie zresetowany przy każdym teście.
Oto fragment kodu, aby uzyskać obiekt DataSource:
private static java.sql.DataSource ds = null;
public static DataSource getDs() {
if(this.ds==null) {
try {
this.ds = manualCreateDataSource();
} catch (Exception e) {
logger.error("Could not initialize Datasource", e);
throw new RuntimeException("Could not initialize Datasource");
}
}
return this.ds;
}
public static DataSource manualCreateDataSource() {
String driverClass = "org.h2.jdbcx.JdbcDataSource";
String jdbcUrl = "jdbc:h2:mem:WeatherAPI;MODE=MySQL;DB_CLOSE_ON_EXIT=TRUE;TRACE_LEVEL_SYSTEM_OUT=1;INIT=runscript from 'src/test/resources/sql/weatherapi.sql'";
int maxPoolSize = 20;
int minPoolSize = 5;
int unreturnedConnectionTimeout = 10;
int idleConnectionTestPeriod = 200;
int maxIdleTime = 1000;
int maxStatementsPerConnection = 5;
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setJdbcUrl(jdbcUrl);
ds.setMaxPoolSize(maxPoolSize);
ds.setMinPoolSize(minPoolSize);
ds.setInitialPoolSize(minPoolSize);
ds.setUnreturnedConnectionTimeout(unreturnedConnectionTimeout);
ds.setIdleConnectionTestPeriod(idleConnectionTestPeriod);
ds.setMaxIdleTime(maxIdleTime);
ds.setMaxStatementsPerConnection(maxStatementsPerConnection);
try {
ds.setDriverClass(driverClass);
} catch (PropertyVetoException e) {
logger.error("error setting driver class", e);
}
return ds;
}
A oto fragment dla weatherapi.sql skryptu:
CREATE SCHEMA IF NOT EXISTS `WeatherAPI`;
USE `WeatherAPI`;
DROP TABLE IF EXISTS `Weather`;
CREATE TABLE IF NOT EXISTS `Weather` (
id int(11) NOT NULL AUTO_INCREMENT,
location char(3) NOT NULL,
period varchar(8) NOT NULL,
duration char DEFAULT NULL,
payload TEXT,
created timestamp NULL DEFAULT NULL,
lastmodified timestamp NULL DEFAULT NULL,
version int(11) NOT NULL, PRIMARY KEY (id)
);
Może chcesz umieścić [mcve] (http: // stackoverflow.com/help/mcve) –
Dołożę więcej starań, aby odtworzyć problem w piaskownicy na przyszłość :-) – ajkret