diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java index 11605224c02..e9330370763 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java @@ -35,12 +35,14 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import static org.assertj.core.api.Assertions.assertThat; @@ -200,6 +202,14 @@ public class DataSourceAutoConfigurationTests { assertThat(dataSource).isInstanceOf(BasicDataSource.class); } + @Test + public void testDataSourceIsInitializedEarly() { + load(TestInitializedDataSourceConfiguration.class, + "spring.datasource.initialize=true"); + assertThat(this.context.getBean( + TestInitializedDataSourceConfiguration.class).called).isTrue(); + } + @SuppressWarnings("unchecked") private T autoConfigureDataSource(Class expectedType, final String... hiddenPackages) { @@ -251,6 +261,22 @@ public class DataSourceAutoConfigurationTests { } + @Configuration + static class TestInitializedDataSourceConfiguration { + + private boolean called; + + @Autowired + public void validateDataSourceIsInitialized(DataSource dataSource) { + // Inject the datasource to validate it is initialized at the injection point + JdbcTemplate template = new JdbcTemplate(dataSource); + assertThat(template.queryForObject("SELECT COUNT(*) from BAR", Integer.class)) + .isEqualTo(1); + this.called = true; + } + + } + // see testExplicitDriverClassClearsUsername public static class DatabaseTestDriver implements Driver { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java index 8f70a4b0650..860a13e75e5 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java @@ -201,7 +201,15 @@ public abstract class AbstractJpaAutoConfigurationTests { } protected void load(Class[] configs, Class[] autoConfigs, String... environment) { + load(configs, autoConfigs, null, environment); + } + + protected void load(Class[] configs, Class[] autoConfigs, + ClassLoader classLoader, String... environment) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + if (classLoader != null) { + ctx.setClassLoader(classLoader); + } TestPropertyValues.of(environment) .and("spring.datasource.generate-unique-name", "true") .applyTo(ctx); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java index 834ce23627e..0b10a219ffc 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java @@ -16,8 +16,17 @@ package org.springframework.boot.autoconfigure.orm.jpa; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; import java.util.Map; +import java.util.Vector; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; import javax.transaction.Synchronization; import javax.transaction.SystemException; import javax.transaction.Transaction; @@ -30,10 +39,14 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.test.City; import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration; import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform; +import org.springframework.context.annotation.Configuration; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; @@ -77,6 +90,17 @@ public class HibernateJpaAutoConfigurationTests load("spring.datasource.data:classpath:/city.sql"); } + @Test + public void testDataScriptRunsEarly() { + load(new Class[] { TestInitializedJpaConfiguration.class }, null, + new HideDataScriptClassLoader(), + "spring.jpa.show-sql=true", + "spring.jpa.hibernate.ddl-auto:create-drop", + "spring.datasource.data:classpath:/city.sql"); + assertThat(this.context.getBean( + TestInitializedJpaConfiguration.class).called).isTrue(); + } + @Test public void testFlywayPlusValidation() throws Exception { load(new Class[0], new Class[] { FlywayAutoConfiguration.class }, @@ -125,6 +149,25 @@ public class HibernateJpaAutoConfigurationTests assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue(); } + @Configuration + @TestAutoConfigurationPackage(City.class) + static class TestInitializedJpaConfiguration { + + private boolean called; + + @Autowired + public void validateDataSourceIsInitialized( + EntityManagerFactory entityManagerFactory) { + // Inject the entity manager to validate it is initialized at the injection point + EntityManager entityManager = entityManagerFactory.createEntityManager(); + City city = entityManager.find(City.class, 2000L); + assertThat(city).isNotNull(); + assertThat(city.getName()).isEqualTo("Washington"); + this.called = true; + } + + } + public static class TestJtaPlatform implements JtaPlatform { @Override @@ -159,4 +202,23 @@ public class HibernateJpaAutoConfigurationTests } + private static class HideDataScriptClassLoader extends URLClassLoader { + + private static final List HIDDEN_RESOURCES = + Arrays.asList("schema-all.sql", "schema.sql"); + + HideDataScriptClassLoader() { + super(new URL[0], HideDataScriptClassLoader.class.getClassLoader()); + } + + + @Override + public Enumeration getResources(String name) throws IOException { + if (HIDDEN_RESOURCES.contains(name)) { + return new Vector().elements(); + } + return super.getResources(name); + } + } + } diff --git a/spring-boot-autoconfigure/src/test/resources/city.sql b/spring-boot-autoconfigure/src/test/resources/city.sql index bb2a2eeac2d..9e0cd1cd79c 100644 --- a/spring-boot-autoconfigure/src/test/resources/city.sql +++ b/spring-boot-autoconfigure/src/test/resources/city.sql @@ -1 +1 @@ -INSERT INTO CITY (NAME, STATE, COUNTRY, MAP) values ('Washington', 'DC', 'US', 'Google'); \ No newline at end of file +INSERT INTO CITY (ID, NAME, STATE, COUNTRY, MAP) values (2000, 'Washington', 'DC', 'US', 'Google'); \ No newline at end of file