java - see - spring boot test h2
Inicialice la base de datos sin la configuraciĆ³n XML, pero utilizando @Configuration (4)
Me gustaría saber cómo inicializar una base de datos sin tener que crear un archivo XML.
Ya uso este tipo de inicialización que funciona bien, pero en mi caso actual no quiero crear un XML:
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
<jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
</jdbc:initialize-database>
Sé que puedo crear una base de datos integrada con:
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql").build();
En mi caso, la base de datos y el esquema se crean utilizando Liquibase.
Solo quiero inicializarlo con Spring y con mi conjunto de datos personalizado, sin tener que crear un nuevo archivo XML cada vez solo por eso.
¿Es posible?
Ciertamente es posible.
Si ya tiene una clase @Configuration
que está siendo cargada por el ApplicationContext
de Spring, entonces simplemente debe crear un nuevo método @Bean
que contendrá el código que ya tiene (con una declaración de return
adicional, por supuesto).
EmbeddedDatabase
implementa la interfaz DataSource
, por lo que se puede usar fácilmente con JdbcTemplate
.
@Bean
public DataSource db() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql");
return builder.build();
}
Después de ver las clases de Spring relacionadas con EmbeddedDatabaseBuilder, descubrí que el DatabaseBuilder está usando un código como este:
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
for (String sqlScript: sqlInitializationScripts ) {
Resource sqlScriptResource = RESOURCE_LOADER.getResource(sqlScript);
populator.addScript(sqlScriptResource);
}
DatabasePopulatorUtils.execute(populator, dataSource);
Esto funcionará bien para mí, incluso si está en un método @BeforeTest y no en la configuración de Spring.
Las siguientes líneas de código dentro de su clase @Configuration
podrían funcionar.
@Value("classpath:com/foo/sql/db-schema.sql")
private Resource schemaScript;
@Value("classpath:com/foo/sql/db-test-data.sql")
private Resource dataScript;
@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
final DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
initializer.setDatabasePopulator(databasePopulator());
return initializer;
}
private DatabasePopulator databasePopulator() {
final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(schemaScript);
populator.addScript(dataScript);
return populator;
}
Tienes que crear tu propio schema.sql
y ponerlo en tu carpeta src/main/resources
.
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
@Configuration
public class DataSourceInitializer {
@Bean(name = "dataSource")
public DataSource getDataSource(){
DataSource dataSource = createDataSource();
DatabasePopulatorUtils.execute(createDatabasePopulator(), dataSource);
return dataSource;
}
private DatabasePopulator createDatabasePopulator() {
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
databasePopulator.setContinueOnError(true);
databasePopulator.addScript(new ClassPathResource("schema.sql"));
return databasePopulator;
}
private SimpleDriverDataSource createDataSource() {
SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
simpleDriverDataSource.setDriverClass(org.h2.Driver.class);
simpleDriverDataSource.setUrl("jdbc:h2:target/database/example;AUTO_RECONNECT=TRUE");
simpleDriverDataSource.setUsername("");
simpleDriverDataSource.setPassword("");
return simpleDriverDataSource;
}
}