Skip to content

Commit 2892039

Browse files
committed
Better tests for datasource initialization
See gh-9528
1 parent 4e19c47 commit 2892039

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java

+26
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@
3535
import org.junit.rules.ExpectedException;
3636

3737
import org.springframework.beans.factory.BeanCreationException;
38+
import org.springframework.beans.factory.annotation.Autowired;
3839
import org.springframework.boot.jdbc.DatabaseDriver;
3940
import org.springframework.boot.test.util.TestPropertyValues;
4041
import org.springframework.context.ConfigurableApplicationContext;
4142
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
4243
import org.springframework.context.annotation.Bean;
4344
import org.springframework.context.annotation.Configuration;
45+
import org.springframework.jdbc.core.JdbcTemplate;
4446
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
4547

4648
import static org.assertj.core.api.Assertions.assertThat;
@@ -200,6 +202,14 @@ public void testDefaultDataSourceCanBeOverridden() throws Exception {
200202
assertThat(dataSource).isInstanceOf(BasicDataSource.class);
201203
}
202204

205+
@Test
206+
public void testDataSourceIsInitializedEarly() {
207+
load(TestInitializedDataSourceConfiguration.class,
208+
"spring.datasource.initialize=true");
209+
assertThat(this.context.getBean(
210+
TestInitializedDataSourceConfiguration.class).called).isTrue();
211+
}
212+
203213
@SuppressWarnings("unchecked")
204214
private <T extends DataSource> T autoConfigureDataSource(Class<T> expectedType,
205215
final String... hiddenPackages) {
@@ -251,6 +261,22 @@ public DataSource dataSource() {
251261

252262
}
253263

264+
@Configuration
265+
static class TestInitializedDataSourceConfiguration {
266+
267+
private boolean called;
268+
269+
@Autowired
270+
public void validateDataSourceIsInitialized(DataSource dataSource) {
271+
// Inject the datasource to validate it is initialized at the injection point
272+
JdbcTemplate template = new JdbcTemplate(dataSource);
273+
assertThat(template.queryForObject("SELECT COUNT(*) from BAR", Integer.class))
274+
.isEqualTo(1);
275+
this.called = true;
276+
}
277+
278+
}
279+
254280
// see testExplicitDriverClassClearsUsername
255281
public static class DatabaseTestDriver implements Driver {
256282

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java

+8
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,15 @@ protected void load(Class<?> config, String... environment) {
201201
}
202202

203203
protected void load(Class<?>[] configs, Class<?>[] autoConfigs, String... environment) {
204+
load(configs, autoConfigs, null, environment);
205+
}
206+
207+
protected void load(Class<?>[] configs, Class<?>[] autoConfigs,
208+
ClassLoader classLoader, String... environment) {
204209
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
210+
if (classLoader != null) {
211+
ctx.setClassLoader(classLoader);
212+
}
205213
TestPropertyValues.of(environment)
206214
.and("spring.datasource.generate-unique-name", "true")
207215
.applyTo(ctx);

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java

+62
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,17 @@
1616

1717
package org.springframework.boot.autoconfigure.orm.jpa;
1818

19+
import java.io.IOException;
20+
import java.net.URL;
21+
import java.net.URLClassLoader;
22+
import java.util.Arrays;
23+
import java.util.Enumeration;
24+
import java.util.List;
1925
import java.util.Map;
26+
import java.util.Vector;
2027

28+
import javax.persistence.EntityManager;
29+
import javax.persistence.EntityManagerFactory;
2130
import javax.transaction.Synchronization;
2231
import javax.transaction.SystemException;
2332
import javax.transaction.Transaction;
@@ -30,10 +39,14 @@
3039
import org.junit.rules.ExpectedException;
3140

3241
import org.springframework.beans.factory.BeanCreationException;
42+
import org.springframework.beans.factory.annotation.Autowired;
43+
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
3344
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
3445
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
46+
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
3547
import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration;
3648
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
49+
import org.springframework.context.annotation.Configuration;
3750
import org.springframework.orm.jpa.JpaTransactionManager;
3851
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
3952

@@ -77,6 +90,17 @@ public void testDataScript() throws Exception {
7790
load("spring.datasource.data:classpath:/city.sql");
7891
}
7992

93+
@Test
94+
public void testDataScriptRunsEarly() {
95+
load(new Class<?>[] { TestInitializedJpaConfiguration.class }, null,
96+
new HideDataScriptClassLoader(),
97+
"spring.jpa.show-sql=true",
98+
"spring.jpa.hibernate.ddl-auto:create-drop",
99+
"spring.datasource.data:classpath:/city.sql");
100+
assertThat(this.context.getBean(
101+
TestInitializedJpaConfiguration.class).called).isTrue();
102+
}
103+
80104
@Test
81105
public void testFlywayPlusValidation() throws Exception {
82106
load(new Class<?>[0], new Class<?>[] { FlywayAutoConfiguration.class },
@@ -125,6 +149,25 @@ public void testCustomJpaTransactionManagerUsingProperties() throws Exception {
125149
assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
126150
}
127151

152+
@Configuration
153+
@TestAutoConfigurationPackage(City.class)
154+
static class TestInitializedJpaConfiguration {
155+
156+
private boolean called;
157+
158+
@Autowired
159+
public void validateDataSourceIsInitialized(
160+
EntityManagerFactory entityManagerFactory) {
161+
// Inject the entity manager to validate it is initialized at the injection point
162+
EntityManager entityManager = entityManagerFactory.createEntityManager();
163+
City city = entityManager.find(City.class, 2000L);
164+
assertThat(city).isNotNull();
165+
assertThat(city.getName()).isEqualTo("Washington");
166+
this.called = true;
167+
}
168+
169+
}
170+
128171
public static class TestJtaPlatform implements JtaPlatform {
129172

130173
@Override
@@ -159,4 +202,23 @@ public int getCurrentStatus() throws SystemException {
159202

160203
}
161204

205+
private static class HideDataScriptClassLoader extends URLClassLoader {
206+
207+
private static final List<String> HIDDEN_RESOURCES =
208+
Arrays.asList("schema-all.sql", "schema.sql");
209+
210+
HideDataScriptClassLoader() {
211+
super(new URL[0], HideDataScriptClassLoader.class.getClassLoader());
212+
}
213+
214+
215+
@Override
216+
public Enumeration<URL> getResources(String name) throws IOException {
217+
if (HIDDEN_RESOURCES.contains(name)) {
218+
return new Vector().elements();
219+
}
220+
return super.getResources(name);
221+
}
222+
}
223+
162224
}
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
INSERT INTO CITY (NAME, STATE, COUNTRY, MAP) values ('Washington', 'DC', 'US', 'Google');
1+
INSERT INTO CITY (ID, NAME, STATE, COUNTRY, MAP) values (2000, 'Washington', 'DC', 'US', 'Google');

0 commit comments

Comments
 (0)