Skip to content

Commit

Permalink
Allow default CacheAwareContextLoaderDelegate to be configured via Sp…
Browse files Browse the repository at this point in the history
…ringProperties

Closes spring-projectsgh-27540
  • Loading branch information
sbrannen committed Oct 10, 2021
1 parent bdfd983 commit db07f7a
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2021 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.
Expand All @@ -25,9 +25,11 @@
import org.apache.commons.logging.LogFactory;

import org.springframework.beans.BeanUtils;
import org.springframework.core.SpringProperties;
import org.springframework.lang.Nullable;
import org.springframework.test.context.TestContextAnnotationUtils.AnnotationDescriptor;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

/**
* {@code BootstrapUtils} is a collection of utility methods to assist with
Expand All @@ -42,6 +44,9 @@
*/
abstract class BootstrapUtils {

private static final String CONTEXT_CACHE_AWARE_CONTEXT_LOADER_DELEGATE_PROPERTY_NAME =
"spring.test.context.default.CacheAwareContextLoaderDelegate";

private static final String DEFAULT_BOOTSTRAP_CONTEXT_CLASS_NAME =
"org.springframework.test.context.support.DefaultBootstrapContext";

Expand Down Expand Up @@ -92,8 +97,12 @@ static BootstrapContext createBootstrapContext(Class<?> testClass) {
private static CacheAwareContextLoaderDelegate createCacheAwareContextLoaderDelegate() {
Class<? extends CacheAwareContextLoaderDelegate> clazz = null;
try {
String className = SpringProperties.getProperty(CONTEXT_CACHE_AWARE_CONTEXT_LOADER_DELEGATE_PROPERTY_NAME);
if (!StringUtils.hasText(className)) {
className = DEFAULT_CACHE_AWARE_CONTEXT_LOADER_DELEGATE_CLASS_NAME;
}
clazz = (Class<? extends CacheAwareContextLoaderDelegate>) ClassUtils.forName(
DEFAULT_CACHE_AWARE_CONTEXT_LOADER_DELEGATE_CLASS_NAME, BootstrapUtils.class.getClassLoader());
className, BootstrapUtils.class.getClassLoader());

if (logger.isDebugEnabled()) {
logger.debug(String.format("Instantiating CacheAwareContextLoaderDelegate from class [%s]",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* Copyright 2002-2021 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
*
* https://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.test.context.support;

import org.junit.jupiter.api.Test;
import org.junit.platform.testkit.engine.EngineTestKit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.SpringProperties;
import org.springframework.test.context.CacheAwareContextLoaderDelegate;
import org.springframework.test.context.MergedContextConfiguration;
import org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;

/**
* Integration tests for configuring a custom {@link CacheAwareContextLoaderDelegate}
* via {@link SpringProperties}.
*
* @author sbrannen
* @since 5.3.11
*/
class CustomCacheAwareContextLoaderDelegateTests {

@Test
void customCacheAwareContextLoaderDelegateConfiguredViaSpringProperties() {
String key = "spring.test.context.default.CacheAwareContextLoaderDelegate";

try {
SpringProperties.setProperty(key, AotCacheAwareContextLoaderDelegate.class.getName());

EngineTestKit.engine("junit-jupiter")//
.selectors(selectClass(TestCase.class))//
.execute()//
.testEvents()//
.assertStatistics(stats -> stats.started(1).succeeded(1).failed(0));
}
finally {
SpringProperties.setProperty(key, null);
}
}


@SpringJUnitConfig
static class TestCase {

@Test
void test(@Autowired String foo) {
// foo will be "bar" unless the AotCacheAwareContextLoaderDelegate is registered.
assertThat(foo).isEqualTo("AOT");
}


@Configuration
static class Config {

@Bean
String foo() {
return "bar";
}
}
}

static class AotCacheAwareContextLoaderDelegate extends DefaultCacheAwareContextLoaderDelegate {

@Override
protected ApplicationContext loadContextInternal(MergedContextConfiguration mergedContextConfiguration) {
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBean("foo", String.class, () -> "AOT");
applicationContext.refresh();
return applicationContext;
}
}

}

0 comments on commit db07f7a

Please sign in to comment.