diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnJavaTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnJavaTests.java index 34e3f00baf0..84716aa677d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnJavaTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnJavaTests.java @@ -25,7 +25,7 @@ import org.junit.Test; import org.springframework.boot.autoconfigure.condition.ConditionalOnJava.Range; import org.springframework.boot.system.JavaVersion; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.testsupport.Assume; import org.springframework.context.annotation.Bean; @@ -105,7 +105,7 @@ public class ConditionalOnJavaTests { } private String getJavaVersion(Class... hiddenClasses) throws Exception { - HideClassesClassLoader classLoader = new HideClassesClassLoader(hiddenClasses); + FilteredClassLoader classLoader = new FilteredClassLoader(hiddenClasses); Class javaVersionClass = classLoader.loadClass(JavaVersion.class.getName()); Method getJavaVersionMethod = ReflectionUtils.findMethod(javaVersionClass, "getJavaVersion"); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java index e871d71bcca..bb777c007ad 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java @@ -28,7 +28,7 @@ import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; import org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration; -import org.springframework.boot.test.context.HidePackagesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ContextConsumer; @@ -237,7 +237,7 @@ public class HttpMessageConvertersAutoConfigurationTests { @Test public void gsonIsPreferredIfJacksonIsNotAvailable() { allOptionsRunner().withClassLoader( - new HidePackagesClassLoader(ObjectMapper.class.getPackage().getName())) + new FilteredClassLoader(ObjectMapper.class.getPackage().getName())) .run((context) -> { assertConverterBeanExists(context, GsonHttpMessageConverter.class, "gsonHttpMessageConverter"); @@ -250,9 +250,9 @@ public class HttpMessageConvertersAutoConfigurationTests { @Test public void jsonbIsPreferredIfJacksonAndGsonAreNotAvailable() { allOptionsRunner() - .withClassLoader(new HidePackagesClassLoader( - ObjectMapper.class.getPackage().getName(), - Gson.class.getPackage().getName())) + .withClassLoader( + new FilteredClassLoader(ObjectMapper.class.getPackage().getName(), + Gson.class.getPackage().getName())) .run(assertConverter(JsonbHttpMessageConverter.class, "jsonbHttpMessageConverter")); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java index 127644b86f0..dfd48543fda 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java @@ -42,7 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; -import org.springframework.boot.test.context.HidePackagesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -166,9 +166,9 @@ public class DataSourceAutoConfigurationTests { @Test public void explicitTypeNoSupportedDataSource() { this.contextRunner - .withClassLoader(new HidePackagesClassLoader("org.apache.tomcat", - "com.zaxxer.hikari", "org.apache.commons.dbcp", - "org.apache.commons.dbcp2")) + .withClassLoader( + new FilteredClassLoader("org.apache.tomcat", "com.zaxxer.hikari", + "org.apache.commons.dbcp", "org.apache.commons.dbcp2")) .withPropertyValues( "spring.datasource.driverClassName:org.hsqldb.jdbcDriver", "spring.datasource.url:jdbc:hsqldb:mem:testdb", @@ -227,7 +227,7 @@ public class DataSourceAutoConfigurationTests { private void assertDataSource(Class expectedType, List hiddenPackages, Consumer consumer) { - HidePackagesClassLoader classLoader = new HidePackagesClassLoader( + FilteredClassLoader classLoader = new FilteredClassLoader( hiddenPackages.toArray(new String[hiddenPackages.size()])); this.contextRunner.withClassLoader(classLoader).run((context) -> { DataSource bean = context.getBean(DataSource.class); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java index ffb11a84491..abeb7b175d9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourcePropertiesTests.java @@ -21,7 +21,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; -import org.springframework.boot.test.context.HidePackagesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import static org.assertj.core.api.Assertions.assertThat; @@ -69,7 +69,7 @@ public class DataSourcePropertiesTests { public void determineUrlWithNoEmbeddedSupport() throws Exception { DataSourceProperties properties = new DataSourceProperties(); properties.setBeanClassLoader( - new HidePackagesClassLoader("org.h2", "org.apache.derby", "org.hsqldb")); + new FilteredClassLoader("org.h2", "org.apache.derby", "org.hsqldb")); properties.afterPropertiesSet(); this.thrown.expect(DataSourceProperties.DataSourceBeanCreationException.class); this.thrown.expectMessage("Cannot determine embedded database url"); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java index 5a836854e1c..8a4b7939e0c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java @@ -25,7 +25,7 @@ import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoCo import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; @@ -59,7 +59,7 @@ public class ReactiveSessionAutoConfigurationMongoTests @Test public void defaultConfigWithUniqueStoreImplementation() { this.contextRunner - .withClassLoader(new HideClassesClassLoader( + .withClassLoader(new FilteredClassLoader( ReactiveRedisOperationsSessionRepository.class)) .withConfiguration(AutoConfigurations.of( EmbeddedMongoAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationRedisTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationRedisTests.java index 4f5f6684c31..865ad42db07 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationRedisTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationRedisTests.java @@ -25,7 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionEvaluationRepor import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration; import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportMessage; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; @@ -62,7 +62,7 @@ public class ReactiveSessionAutoConfigurationRedisTests @Test public void defaultConfigWithUniqueStoreImplementation() { this.contextRunner - .withClassLoader(new HideClassesClassLoader( + .withClassLoader(new FilteredClassLoader( ReactiveMongoOperationsSessionRepository.class)) .withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class)) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationHazelcastTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationHazelcastTests.java index 003195a834c..b40149fa069 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationHazelcastTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationHazelcastTests.java @@ -22,7 +22,7 @@ import org.junit.Test; import org.springframework.beans.DirectFieldAccessor; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -61,7 +61,7 @@ public class SessionAutoConfigurationHazelcastTests public void defaultConfigWithUniqueStoreImplementation() { this.contextRunner .withClassLoader( - new HideClassesClassLoader(JdbcOperationsSessionRepository.class, + new FilteredClassLoader(JdbcOperationsSessionRepository.class, RedisOperationsSessionRepository.class, MongoOperationsSessionRepository.class)) .run(this::validateDefaultConfig); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java index f6f7bd8a106..a259b0bbf85 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java @@ -27,7 +27,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerA import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration.SpringBootJdbcHttpSessionConfiguration; import org.springframework.boot.jdbc.DataSourceInitializationMode; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -67,10 +67,9 @@ public class SessionAutoConfigurationJdbcTests @Test public void defaultConfigWithUniqueStoreImplementation() { this.contextRunner - .withClassLoader( - new HideClassesClassLoader(HazelcastSessionRepository.class, - MongoOperationsSessionRepository.class, - RedisOperationsSessionRepository.class)) + .withClassLoader(new FilteredClassLoader(HazelcastSessionRepository.class, + MongoOperationsSessionRepository.class, + RedisOperationsSessionRepository.class)) .run(this::validateDefaultConfig); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java index 4248edeb167..35677404593 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java @@ -23,7 +23,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; @@ -57,10 +57,9 @@ public class SessionAutoConfigurationMongoTests @Test public void defaultConfigWithUniqueStoreImplementation() { this.contextRunner - .withClassLoader( - new HideClassesClassLoader(HazelcastSessionRepository.class, - JdbcOperationsSessionRepository.class, - RedisOperationsSessionRepository.class)) + .withClassLoader(new FilteredClassLoader(HazelcastSessionRepository.class, + JdbcOperationsSessionRepository.class, + RedisOperationsSessionRepository.class)) .withConfiguration(AutoConfigurations.of( EmbeddedMongoAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class)) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java index 0c24ae097ef..0694a52b04e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java @@ -23,7 +23,7 @@ import org.springframework.beans.DirectFieldAccessor; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.session.RedisSessionConfiguration.SpringBootRedisHttpSessionConfiguration; -import org.springframework.boot.test.context.HideClassesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; @@ -62,10 +62,9 @@ public class SessionAutoConfigurationRedisTests @Test public void defaultConfigWithUniqueStoreImplementation() { this.contextRunner - .withClassLoader( - new HideClassesClassLoader(HazelcastSessionRepository.class, - JdbcOperationsSessionRepository.class, - MongoOperationsSessionRepository.class)) + .withClassLoader(new FilteredClassLoader(HazelcastSessionRepository.class, + JdbcOperationsSessionRepository.class, + MongoOperationsSessionRepository.class)) .withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class)) .run(validateSpringSessionUsesRedis("spring:session:event:created:", RedisFlushMode.ON_SAVE, "0 * * * * *")); diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java new file mode 100644 index 00000000000..569696acabb --- /dev/null +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/FilteredClassLoader.java @@ -0,0 +1,126 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.context; + +import java.net.URL; +import java.net.URLClassLoader; +import java.util.function.Predicate; + +/** + * Test {@link URLClassLoader} that can filter the classes it can load. + * + * @author Andy Wilkinson + * @author Stephane Nicoll + * @author Phillip Webb + * @since 2.0.0 + */ +public class FilteredClassLoader extends URLClassLoader { + + private final Predicate[] filters; + + /** + * Create a {@link FilteredClassLoader} that hides the given classes. + * @param hiddenClasses the classes to hide + */ + public FilteredClassLoader(Class... hiddenClasses) { + this(ClassFilter.of(hiddenClasses)); + } + + /** + * Create a {@link FilteredClassLoader} that hides classes from the given packages. + * @param hiddenPackages the packages to hide + */ + public FilteredClassLoader(String... hiddenPackages) { + this(PackageFilter.of(hiddenPackages)); + } + + /** + * Create a {@link FilteredClassLoader} that filters based on the given predicate. + * @param filters a set of filters to determine when a class name should be hidden. A + * {@link Predicate#test(Object) result} of {@code true} indicates a filtered class. + */ + @SafeVarargs + public FilteredClassLoader(Predicate... filters) { + super(new URL[0], FilteredClassLoader.class.getClassLoader()); + this.filters = filters; + } + + @Override + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + for (Predicate filter : this.filters) { + if (filter.test(name)) { + throw new ClassNotFoundException(); + } + } + return super.loadClass(name, resolve); + } + + /** + * Filter to restrict the classes that can be loaded. + */ + public final static class ClassFilter implements Predicate { + + private Class[] hiddenClasses; + + private ClassFilter(Class[] hiddenClasses) { + this.hiddenClasses = hiddenClasses; + } + + @Override + public boolean test(String className) { + for (Class hiddenClass : this.hiddenClasses) { + if (className.equals(hiddenClass.getName())) { + return true; + } + } + return false; + } + + public static ClassFilter of(Class... hiddenClasses) { + return new ClassFilter(hiddenClasses); + } + + } + + /** + * Filter to restrict the packages that can be loaded. + */ + public final static class PackageFilter implements Predicate { + + private final String[] hiddenPackages; + + private PackageFilter(String[] hiddenPackages) { + this.hiddenPackages = hiddenPackages; + } + + @Override + public boolean test(String className) { + for (String hiddenPackage : this.hiddenPackages) { + if (className.startsWith(hiddenPackage)) { + return true; + } + } + return false; + } + + public static PackageFilter of(String... hiddenPackages) { + return new PackageFilter(hiddenPackages); + } + + } +} diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/HideClassesClassLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/HideClassesClassLoader.java deleted file mode 100644 index abf4e026d41..00000000000 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/HideClassesClassLoader.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.test.context; - -import java.net.URL; -import java.net.URLClassLoader; - -/** - * Test {@link URLClassLoader} that hides configurable classes. - * - * @author Stephane Nicoll - * @since 2.0.0 - */ -public class HideClassesClassLoader extends URLClassLoader { - - private final Class[] hiddenClasses; - - public HideClassesClassLoader(Class... hiddenClasses) { - super(new URL[0], HideClassesClassLoader.class.getClassLoader()); - this.hiddenClasses = hiddenClasses; - } - - @Override - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException { - for (Class hiddenClass : this.hiddenClasses) { - if (name.equals(hiddenClass.getName())) { - throw new ClassNotFoundException(); - } - } - return super.loadClass(name, resolve); - } - -} diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/HidePackagesClassLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/HidePackagesClassLoader.java deleted file mode 100644 index 7634331f37d..00000000000 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/HidePackagesClassLoader.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2012-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.test.context; - -import java.net.URL; -import java.net.URLClassLoader; - -/** - * Test {@link URLClassLoader} that hides configurable packages. No class in one of those - * packages or sub-packages are visible. - * - * @author Andy Wilkinson - * @author Stephane Nicoll - * @since 2.0.0 - */ -public final class HidePackagesClassLoader extends URLClassLoader { - - private final String[] hiddenPackages; - - /** - * Create a new instance with the packages to hide. - * @param hiddenPackages the packages to hide - */ - public HidePackagesClassLoader(String... hiddenPackages) { - super(new URL[0], HidePackagesClassLoader.class.getClassLoader()); - this.hiddenPackages = hiddenPackages; - } - - @Override - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException { - for (String hiddenPackage : this.hiddenPackages) { - if (name.startsWith(hiddenPackage)) { - throw new ClassNotFoundException(); - } - } - return super.loadClass(name, resolve); - } - -} diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java index 64067fb1854..8f67fbd3d02 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java @@ -23,7 +23,7 @@ import java.util.function.Supplier; import org.springframework.boot.context.annotation.Configurations; import org.springframework.boot.context.annotation.UserConfigurations; -import org.springframework.boot.test.context.HidePackagesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.ApplicationContextAssert; import org.springframework.boot.test.context.assertj.ApplicationContextAssertProvider; import org.springframework.boot.test.util.TestPropertyValues; @@ -180,7 +180,7 @@ abstract class AbstractApplicationContextRunner false); + Class loaded = classLoader.loadClass(getClass().getName()); + assertThat(loaded.getName()).isEqualTo(getClass().getName()); + classLoader.close(); + } + +} diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java index 5b5a86ceda5..dcc9abcc3b8 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java @@ -25,7 +25,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.boot.context.annotation.UserConfigurations; -import org.springframework.boot.test.context.HidePackagesClassLoader; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.ApplicationContextAssertProvider; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -34,7 +34,7 @@ import org.springframework.core.env.Environment; import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; +import static org.junit.Assert.fail; /** * Abstract tests for {@link AbstractApplicationContextRunner} implementations. @@ -148,8 +148,7 @@ public abstract class AbstractApplicationContextRunnerTests { try { ClassUtils.forName(Gson.class.getName(),