This commit is contained in:
Stephane Nicoll 2017-06-28 09:40:23 +02:00
parent acaef9c95a
commit 1ba0df99b2
1 changed files with 70 additions and 82 deletions

View File

@ -30,19 +30,21 @@ import javax.sql.DataSource;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
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.datasource.SimpleDriverDataSource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.contains;
import static org.mockito.Mockito.mock;
/**
@ -53,62 +55,49 @@ import static org.mockito.Mockito.mock;
*/
public class DataSourceAutoConfigurationTests {
private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Before
public void init() {
EmbeddedDatabaseConnection.override = null;
TestPropertyValues.of("spring.datasource.initialize:false",
"spring.datasource.url:jdbc:hsqldb:mem:testdb-" + new Random().nextInt())
.applyTo(this.context);
}
private ConfigurableApplicationContext context;
@After
public void restore() {
EmbeddedDatabaseConnection.override = null;
this.context.close();
public void close() {
if (this.context != null) {
this.context.close();
}
}
@Test
public void testDefaultDataSourceExists() throws Exception {
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
}
@Test
public void testDataSourceHasEmbeddedDefault() throws Exception {
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load();
HikariDataSource dataSource = this.context.getBean(HikariDataSource.class);
assertThat(dataSource.getJdbcUrl()).isNotNull();
assertThat(dataSource.getDriverClassName()).isNotNull();
}
@Test(expected = BeanCreationException.class)
@Test
public void testBadUrl() throws Exception {
TestPropertyValues.of("spring.datasource.url:jdbc:not-going-to-work")
.applyTo(this.context);
EmbeddedDatabaseConnection.override = EmbeddedDatabaseConnection.NONE;
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
try {
EmbeddedDatabaseConnection.override = EmbeddedDatabaseConnection.NONE;
this.thrown.expect(BeanCreationException.class);
load("spring.datasource.url:jdbc:not-going-to-work");
}
finally {
EmbeddedDatabaseConnection.override = null;
}
}
@Test(expected = BeanCreationException.class)
@Test
public void testBadDriverClass() throws Exception {
TestPropertyValues
.of("spring.datasource.driverClassName:org.none.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb")
.applyTo(this.context);
EmbeddedDatabaseConnection.override = EmbeddedDatabaseConnection.NONE;
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
this.thrown.expect(BeanCreationException.class);
this.thrown.expectMessage(contains("org.none.jdbcDriver"));
load("spring.datasource.driverClassName:org.none.jdbcDriver");
}
@Test
@ -123,7 +112,7 @@ public class DataSourceAutoConfigurationTests {
public void tomcatIsFallback() throws Exception {
org.apache.tomcat.jdbc.pool.DataSource dataSource = autoConfigureDataSource(
org.apache.tomcat.jdbc.pool.DataSource.class, "com.zaxxer.hikari");
assertThat(dataSource.getUrl()).isEqualTo("jdbc:hsqldb:mem:testdb");
assertThat(dataSource.getUrl()).startsWith("jdbc:hsqldb:mem:testdb");
}
@Test
@ -139,7 +128,7 @@ public class DataSourceAutoConfigurationTests {
public void commonsDbcp2IsFallback() throws Exception {
BasicDataSource dataSource = autoConfigureDataSource(BasicDataSource.class,
"com.zaxxer.hikari", "org.apache.tomcat");
assertThat(dataSource.getUrl()).isEqualTo("jdbc:hsqldb:mem:testdb");
assertThat(dataSource.getUrl()).startsWith("jdbc:hsqldb:mem:testdb");
}
@Test
@ -153,13 +142,8 @@ public class DataSourceAutoConfigurationTests {
@Test
public void testEmbeddedTypeDefaultsUsername() throws Exception {
TestPropertyValues
.of("spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb")
.applyTo(this.context);
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load("spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb");
DataSource bean = this.context.getBean(DataSource.class);
assertThat(bean).isNotNull();
@SuppressWarnings("resource")
@ -174,33 +158,25 @@ public class DataSourceAutoConfigurationTests {
*/
@Test
public void explicitTypeNoSupportedDataSource() {
TestPropertyValues
.of("spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb",
"spring.datasource.type:"
+ SimpleDriverDataSource.class.getName())
.applyTo(this.context);
this.context.setClassLoader(
new HidePackagesClassLoader("org.apache.tomcat", "com.zaxxer.hikari",
"org.apache.commons.dbcp", "org.apache.commons.dbcp2"));
load(null, new HidePackagesClassLoader("org.apache.tomcat", "com.zaxxer.hikari",
"org.apache.commons.dbcp", "org.apache.commons.dbcp2"),
"spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb",
"spring.datasource.type:"
+ SimpleDriverDataSource.class.getName());
testExplicitType();
}
@Test
public void explicitTypeSupportedDataSource() {
TestPropertyValues
.of("spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb",
"spring.datasource.type:"
+ SimpleDriverDataSource.class.getName())
.applyTo(this.context);
load("spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb",
"spring.datasource.type:"
+ SimpleDriverDataSource.class.getName());
testExplicitType();
}
private void testExplicitType() {
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
assertThat(this.context.getBeansOfType(DataSource.class)).hasSize(1);
DataSource bean = this.context.getBean(DataSource.class);
assertThat(bean).isNotNull();
@ -209,12 +185,8 @@ public class DataSourceAutoConfigurationTests {
@Test
public void testExplicitDriverClassClearsUsername() throws Exception {
TestPropertyValues.of(
"spring.datasource.driverClassName:" + DatabaseTestDriver.class.getName(),
"spring.datasource.url:jdbc:foo://localhost").applyTo(this.context);
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load("spring.datasource.driverClassName:" + DatabaseTestDriver.class.getName(),
"spring.datasource.url:jdbc:foo://localhost");
DataSource dataSource = this.context.getBean(DataSource.class);
assertThat(dataSource).isNotNull();
assertThat(((HikariDataSource) dataSource).getDriverClassName())
@ -224,10 +196,7 @@ public class DataSourceAutoConfigurationTests {
@Test
public void testDefaultDataSourceCanBeOverridden() throws Exception {
this.context.register(TestDataSourceConfiguration.class,
DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load(TestDataSourceConfiguration.class);
DataSource dataSource = this.context.getBean(DataSource.class);
assertThat(dataSource).isInstanceOf(BasicDataSource.class);
}
@ -235,19 +204,38 @@ public class DataSourceAutoConfigurationTests {
@SuppressWarnings("unchecked")
private <T extends DataSource> T autoConfigureDataSource(Class<T> expectedType,
final String... hiddenPackages) {
TestPropertyValues
.of("spring.datasource.driverClassName:org.hsqldb.jdbcDriver",
"spring.datasource.url:jdbc:hsqldb:mem:testdb")
.applyTo(this.context);
this.context.setClassLoader(new HidePackagesClassLoader(hiddenPackages));
this.context.register(DataSourceAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load(null, new HidePackagesClassLoader(hiddenPackages));
DataSource bean = this.context.getBean(DataSource.class);
assertThat(bean).isInstanceOf(expectedType);
return (T) bean;
}
public void load(String... environment) {
load(null, environment);
}
public void load(Class<?> config, String... environment) {
load(config, null, environment);
}
public void load(Class<?> config, ClassLoader classLoader, String... environment) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
if (classLoader != null) {
ctx.setClassLoader(classLoader);
}
TestPropertyValues
.of("spring.datasource.initialize=false",
"spring.datasource.url:jdbc:hsqldb:mem:testdb-" + new Random().nextInt())
.applyTo(ctx);
TestPropertyValues.of(environment).applyTo(ctx);
if (config != null) {
ctx.register(config);
}
ctx.register(DataSourceAutoConfiguration.class);
ctx.refresh();
this.context = ctx;
}
@Configuration
static class TestDataSourceConfiguration {