Switch test to ApplicationContextRunner

This commit is contained in:
Stephane Nicoll 2018-02-28 13:57:53 +01:00
parent 299eca084c
commit 5fa71a1f94
1 changed files with 54 additions and 68 deletions

View File

@ -17,7 +17,6 @@
package org.springframework.boot.autoconfigure.jdbc; package org.springframework.boot.autoconfigure.jdbc;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.sql.SQLException;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -30,13 +29,11 @@ import com.zaxxer.hikari.HikariDataSource;
import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.DataSourceProxy; import org.apache.tomcat.jdbc.pool.DataSourceProxy;
import org.apache.tomcat.jdbc.pool.jmx.ConnectionPool; import org.apache.tomcat.jdbc.pool.jmx.ConnectionPool;
import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -47,27 +44,25 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
public class DataSourceJmxConfigurationTests { public class DataSourceJmxConfigurationTests {
private ConfigurableApplicationContext context; private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withPropertyValues("spring.datasource.url="
@After + "jdbc:hsqldb:mem:test-" + UUID.randomUUID())
public void close() { .withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class,
if (this.context != null) { DataSourceAutoConfiguration.class));
this.context.close();
}
}
@Test @Test
public void hikariAutoConfiguredCanUseRegisterMBeans() public void hikariAutoConfiguredCanUseRegisterMBeans() {
throws MalformedObjectNameException {
String poolName = UUID.randomUUID().toString(); String poolName = UUID.randomUUID().toString();
load("spring.datasource.type=" + HikariDataSource.class.getName(), this.contextRunner.withPropertyValues(
"spring.datasource.type=" + HikariDataSource.class.getName(),
"spring.datasource.name=" + poolName, "spring.datasource.name=" + poolName,
"spring.datasource.hikari.register-mbeans=true"); "spring.datasource.hikari.register-mbeans=true").run((context) -> {
assertThat(this.context.getBeansOfType(HikariDataSource.class)).hasSize(1); assertThat(context).hasSingleBean(HikariDataSource.class);
assertThat(this.context.getBean(HikariDataSource.class).isRegisterMbeans()) assertThat(context.getBean(HikariDataSource.class).isRegisterMbeans())
.isTrue(); .isTrue();
MBeanServer mBeanServer = this.context.getBean(MBeanServer.class); MBeanServer mBeanServer = context.getBean(MBeanServer.class);
validateHikariMBeansRegistration(mBeanServer, poolName, true); validateHikariMBeansRegistration(mBeanServer, poolName, true);
});
} }
@Test @Test
@ -76,72 +71,63 @@ public class DataSourceJmxConfigurationTests {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectInstance> existingInstances = mBeanServer Set<ObjectInstance> existingInstances = mBeanServer
.queryMBeans(new ObjectName("com.zaxxer.hikari:type=*"), null); .queryMBeans(new ObjectName("com.zaxxer.hikari:type=*"), null);
load("spring.datasource.type=" + HikariDataSource.class.getName(), this.contextRunner.withPropertyValues(
"spring.datasource.hikari.register-mbeans=true"); "spring.datasource.type=" + HikariDataSource.class.getName(),
assertThat(this.context.getBeansOfType(HikariDataSource.class)).hasSize(1); "spring.datasource.hikari.register-mbeans=true").run((context) -> {
assertThat(this.context.getBean(HikariDataSource.class).isRegisterMbeans()) assertThat(context).hasSingleBean(HikariDataSource.class);
.isTrue(); assertThat(context.getBean(HikariDataSource.class).isRegisterMbeans())
// We can't rely on the number of MBeans so we're checking that the pool and pool .isTrue();
// config MBeans were registered // We can't rely on the number of MBeans so we're checking that the pool and pool
assertThat(mBeanServer // config MBeans were registered
.queryMBeans(new ObjectName("com.zaxxer.hikari:type=*"), null).size()) assertThat(mBeanServer
.isEqualTo(existingInstances.size() + 2); .queryMBeans(new ObjectName("com.zaxxer.hikari:type=*"), null).size())
.isEqualTo(existingInstances.size() + 2);
});
} }
@Test @Test
public void hikariAutoConfiguredUsesJmsFlag() throws MalformedObjectNameException { public void hikariAutoConfiguredUsesJmsFlag() {
String poolName = UUID.randomUUID().toString(); String poolName = UUID.randomUUID().toString();
load("spring.datasource.type=" + HikariDataSource.class.getName(), this.contextRunner.withPropertyValues(
"spring.datasource.type=" + HikariDataSource.class.getName(),
"spring.jmx.enabled=false", "spring.datasource.name=" + poolName, "spring.jmx.enabled=false", "spring.datasource.name=" + poolName,
"spring.datasource.hikari.register-mbeans=true"); "spring.datasource.hikari.register-mbeans=true").run((context) -> {
assertThat(this.context.getBeansOfType(HikariDataSource.class)).hasSize(1); assertThat(context).hasSingleBean(HikariDataSource.class);
assertThat(this.context.getBean(HikariDataSource.class).isRegisterMbeans()) assertThat(context.getBean(HikariDataSource.class).isRegisterMbeans())
.isTrue(); .isTrue();
// Hikari can still register mBeans // Hikari can still register mBeans
validateHikariMBeansRegistration(ManagementFactory.getPlatformMBeanServer(), validateHikariMBeansRegistration(ManagementFactory.getPlatformMBeanServer(),
poolName, true); poolName, true);
});
} }
private void validateHikariMBeansRegistration(MBeanServer mBeanServer, private void validateHikariMBeansRegistration(MBeanServer mBeanServer,
String poolName, boolean expected) throws MalformedObjectNameException { String poolName, boolean expected) throws MalformedObjectNameException {
assertThat(mBeanServer.isRegistered( assertThat(mBeanServer.isRegistered(
new ObjectName("com.zaxxer.hikari:type=Pool (" + poolName + ")"))) new ObjectName("com.zaxxer.hikari:type=Pool (" + poolName + ")")))
.isEqualTo(expected); .isEqualTo(expected);
assertThat(mBeanServer.isRegistered( assertThat(mBeanServer.isRegistered(
new ObjectName("com.zaxxer.hikari:type=PoolConfig (" + poolName + ")"))) new ObjectName("com.zaxxer.hikari:type=PoolConfig (" + poolName + ")")))
.isEqualTo(expected); .isEqualTo(expected);
} }
@Test @Test
public void tomcatDoesNotExposeMBeanPoolByDefault() { public void tomcatDoesNotExposeMBeanPoolByDefault() {
load("spring.datasource.type=" + DataSource.class.getName()); this.contextRunner
assertThat(this.context.getBeansOfType(ConnectionPool.class)).isEmpty(); .withPropertyValues("spring.datasource.type=" + DataSource.class.getName())
.run((context) ->
assertThat(context).doesNotHaveBean(ConnectionPool.class));
} }
@Test @Test
public void tomcatAutoConfiguredCanExposeMBeanPool() throws SQLException { public void tomcatAutoConfiguredCanExposeMBeanPool() {
load("spring.datasource.type=" + DataSource.class.getName(), this.contextRunner.withPropertyValues(
"spring.datasource.jmx-enabled=true"); "spring.datasource.type=" + DataSource.class.getName(),
assertThat(this.context.getBeansOfType(ConnectionPool.class)).hasSize(1); "spring.datasource.jmx-enabled=true").run((context) -> {
assertThat(this.context.getBean(DataSourceProxy.class).createPool().getJmxPool()) assertThat(context).hasSingleBean(ConnectionPool.class);
.isSameAs(this.context.getBean(ConnectionPool.class)); assertThat(context.getBean(DataSourceProxy.class).createPool().getJmxPool())
} .isSameAs(context.getBean(ConnectionPool.class));
});
private void load(String... environment) {
load(null, environment);
}
private void load(Class<?> config, String... environment) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
String jdbcUrl = "jdbc:hsqldb:mem:test-" + UUID.randomUUID();
TestPropertyValues.of(environment).and("spring.datasource.url=" + jdbcUrl)
.applyTo(context);
if (config != null) {
context.register(config);
}
context.register(JmxAutoConfiguration.class, DataSourceAutoConfiguration.class);
context.refresh();
this.context = context;
} }
} }