Browse Source
The `CacheResolver` and `ErrorHandler` features introduced in 4.1 were not properly enabled in AspectJ mode. This commit adds more tests from the regular proxy-based mode and align the AspectJ caching configuration. Issue: SPR-14413pull/1095/head
6 changed files with 396 additions and 10 deletions
@ -0,0 +1,288 @@
@@ -0,0 +1,288 @@
|
||||
/* |
||||
* Copyright 2002-2016 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.cache.aspectj; |
||||
|
||||
import org.junit.After; |
||||
import org.junit.Ignore; |
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.beans.factory.BeanCreationException; |
||||
import org.springframework.cache.CacheManager; |
||||
import org.springframework.cache.CacheTestUtils; |
||||
import org.springframework.cache.annotation.CachingConfigurerSupport; |
||||
import org.springframework.cache.annotation.EnableCaching; |
||||
import org.springframework.cache.config.AnnotatedClassCacheableService; |
||||
import org.springframework.cache.config.CacheableService; |
||||
import org.springframework.cache.config.DefaultCacheableService; |
||||
import org.springframework.cache.config.SomeCustomKeyGenerator; |
||||
import org.springframework.cache.config.SomeKeyGenerator; |
||||
import org.springframework.cache.interceptor.CacheErrorHandler; |
||||
import org.springframework.cache.interceptor.CacheInterceptor; |
||||
import org.springframework.cache.interceptor.CacheResolver; |
||||
import org.springframework.cache.interceptor.KeyGenerator; |
||||
import org.springframework.cache.interceptor.NamedCacheResolver; |
||||
import org.springframework.cache.interceptor.SimpleCacheErrorHandler; |
||||
import org.springframework.cache.interceptor.SimpleCacheResolver; |
||||
import org.springframework.cache.support.NoOpCacheManager; |
||||
import org.springframework.context.ConfigurableApplicationContext; |
||||
import org.springframework.context.annotation.AdviceMode; |
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
import static org.junit.Assert.*; |
||||
|
||||
/** |
||||
* |
||||
* @author Stephane Nicoll |
||||
*/ |
||||
public class AspectJEnableCachingIsolatedTests { |
||||
|
||||
private ConfigurableApplicationContext ctx; |
||||
|
||||
@After |
||||
public void closeContext() { |
||||
if (this.ctx != null) { |
||||
this.ctx.close(); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void testKeyStrategy() { |
||||
load(EnableCachingConfig.class); |
||||
AnnotationCacheAspect aspect = this.ctx.getBean(AnnotationCacheAspect.class); |
||||
assertSame(this.ctx.getBean("keyGenerator", KeyGenerator.class), aspect.getKeyGenerator()); |
||||
} |
||||
|
||||
@Test |
||||
public void testCacheErrorHandler() { |
||||
load(EnableCachingConfig.class); |
||||
AnnotationCacheAspect aspect = this.ctx.getBean(AnnotationCacheAspect.class); |
||||
assertSame(this.ctx.getBean("errorHandler", CacheErrorHandler.class), aspect.getErrorHandler()); |
||||
} |
||||
|
||||
// --- local tests -------
|
||||
|
||||
@Test |
||||
public void singleCacheManagerBean() throws Throwable { |
||||
load(SingleCacheManagerConfig.class); |
||||
} |
||||
|
||||
@Test(expected = IllegalStateException.class) |
||||
public void multipleCacheManagerBeans() throws Throwable { |
||||
try { |
||||
load(MultiCacheManagerConfig.class); |
||||
} |
||||
catch (BeanCreationException ex) { |
||||
Throwable root = ex.getRootCause(); |
||||
assertTrue(root.getMessage().contains("beans of type CacheManager")); |
||||
throw root; |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void multipleCacheManagerBeans_implementsCachingConfigurer() { |
||||
load(MultiCacheManagerConfigurer.class); // does not throw
|
||||
} |
||||
|
||||
@Test(expected = IllegalStateException.class) |
||||
public void multipleCachingConfigurers() throws Throwable { |
||||
try { |
||||
load(MultiCacheManagerConfigurer.class, EnableCachingConfig.class); |
||||
} |
||||
catch (BeanCreationException ex) { |
||||
Throwable root = ex.getRootCause(); |
||||
assertTrue(root.getMessage().contains("implementations of CachingConfigurer")); |
||||
throw root; |
||||
} |
||||
} |
||||
|
||||
@Test(expected = IllegalStateException.class) |
||||
public void noCacheManagerBeans() throws Throwable { |
||||
try { |
||||
load(EmptyConfig.class); |
||||
} |
||||
catch (BeanCreationException ex) { |
||||
Throwable root = ex.getRootCause(); |
||||
assertTrue(root.getMessage().contains("No bean of type CacheManager")); |
||||
throw root; |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
@Ignore("AspectJ has some sort of caching that makes this one fail") |
||||
public void emptyConfigSupport() { |
||||
load(EmptyConfigSupportConfig.class); |
||||
AnnotationCacheAspect aspect = this.ctx.getBean(AnnotationCacheAspect.class); |
||||
assertNotNull(aspect.getCacheResolver()); |
||||
assertEquals(SimpleCacheResolver.class, aspect.getCacheResolver().getClass()); |
||||
assertSame(this.ctx.getBean(CacheManager.class), |
||||
((SimpleCacheResolver) aspect.getCacheResolver()).getCacheManager()); |
||||
} |
||||
|
||||
@Test |
||||
public void bothSetOnlyResolverIsUsed() { |
||||
load(FullCachingConfig.class); |
||||
|
||||
AnnotationCacheAspect aspect = this.ctx.getBean(AnnotationCacheAspect.class); |
||||
assertSame(this.ctx.getBean("cacheResolver"), aspect.getCacheResolver()); |
||||
assertSame(this.ctx.getBean("keyGenerator"), aspect.getKeyGenerator()); |
||||
} |
||||
|
||||
private void load(Class<?>... config) { |
||||
this.ctx = new AnnotationConfigApplicationContext(config); |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class EnableCachingConfig extends CachingConfigurerSupport { |
||||
|
||||
@Override |
||||
@Bean |
||||
public CacheManager cacheManager() { |
||||
return CacheTestUtils.createSimpleCacheManager("testCache", "primary", "secondary"); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheableService<?> service() { |
||||
return new DefaultCacheableService(); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheableService<?> classService() { |
||||
return new AnnotatedClassCacheableService(); |
||||
} |
||||
|
||||
@Override |
||||
@Bean |
||||
public KeyGenerator keyGenerator() { |
||||
return new SomeKeyGenerator(); |
||||
} |
||||
|
||||
@Override |
||||
@Bean |
||||
public CacheErrorHandler errorHandler() { |
||||
return new SimpleCacheErrorHandler(); |
||||
} |
||||
|
||||
@Bean |
||||
public KeyGenerator customKeyGenerator() { |
||||
return new SomeCustomKeyGenerator(); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheManager customCacheManager() { |
||||
return CacheTestUtils.createSimpleCacheManager("testCache"); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class EmptyConfig { |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class SingleCacheManagerConfig { |
||||
|
||||
@Bean |
||||
public CacheManager cm1() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class MultiCacheManagerConfig { |
||||
|
||||
@Bean |
||||
public CacheManager cm1() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheManager cm2() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class MultiCacheManagerConfigurer extends CachingConfigurerSupport { |
||||
|
||||
@Bean |
||||
public CacheManager cm1() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheManager cm2() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
|
||||
@Override |
||||
public CacheManager cacheManager() { |
||||
return cm1(); |
||||
} |
||||
|
||||
@Override |
||||
public KeyGenerator keyGenerator() { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class EmptyConfigSupportConfig extends CachingConfigurerSupport { |
||||
|
||||
@Bean |
||||
public CacheManager cm() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class FullCachingConfig extends CachingConfigurerSupport { |
||||
|
||||
@Override |
||||
@Bean |
||||
public CacheManager cacheManager() { |
||||
return new NoOpCacheManager(); |
||||
} |
||||
|
||||
@Override |
||||
@Bean |
||||
public KeyGenerator keyGenerator() { |
||||
return new SomeKeyGenerator(); |
||||
} |
||||
|
||||
@Override |
||||
@Bean |
||||
public CacheResolver cacheResolver() { |
||||
return new NamedCacheResolver(cacheManager(), "foo"); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,93 @@
@@ -0,0 +1,93 @@
|
||||
/* |
||||
* Copyright 2002-2016 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.cache.aspectj; |
||||
|
||||
import org.springframework.cache.CacheManager; |
||||
import org.springframework.cache.CacheTestUtils; |
||||
import org.springframework.cache.annotation.CachingConfigurerSupport; |
||||
import org.springframework.cache.annotation.EnableCaching; |
||||
import org.springframework.cache.config.AbstractCacheAnnotationTests; |
||||
import org.springframework.cache.config.AnnotatedClassCacheableService; |
||||
import org.springframework.cache.config.CacheableService; |
||||
import org.springframework.cache.config.DefaultCacheableService; |
||||
import org.springframework.cache.config.SomeCustomKeyGenerator; |
||||
import org.springframework.cache.config.SomeKeyGenerator; |
||||
import org.springframework.cache.interceptor.CacheErrorHandler; |
||||
import org.springframework.cache.interceptor.KeyGenerator; |
||||
import org.springframework.cache.interceptor.SimpleCacheErrorHandler; |
||||
import org.springframework.context.ConfigurableApplicationContext; |
||||
import org.springframework.context.annotation.AdviceMode; |
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
/** |
||||
* |
||||
* @author Stephane Nicoll |
||||
*/ |
||||
public class AspectJEnableCachingTests extends AbstractCacheAnnotationTests { |
||||
|
||||
/** hook into superclass suite of tests */ |
||||
@Override |
||||
protected ConfigurableApplicationContext getApplicationContext() { |
||||
return new AnnotationConfigApplicationContext(EnableCachingConfig.class); |
||||
} |
||||
|
||||
@Configuration |
||||
@EnableCaching(mode = AdviceMode.ASPECTJ) |
||||
static class EnableCachingConfig extends CachingConfigurerSupport { |
||||
|
||||
@Override |
||||
@Bean |
||||
public CacheManager cacheManager() { |
||||
return CacheTestUtils.createSimpleCacheManager("testCache", "primary", "secondary"); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheableService<?> service() { |
||||
return new DefaultCacheableService(); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheableService<?> classService() { |
||||
return new AnnotatedClassCacheableService(); |
||||
} |
||||
|
||||
@Override |
||||
@Bean |
||||
public KeyGenerator keyGenerator() { |
||||
return new SomeKeyGenerator(); |
||||
} |
||||
|
||||
@Override |
||||
@Bean |
||||
public CacheErrorHandler errorHandler() { |
||||
return new SimpleCacheErrorHandler(); |
||||
} |
||||
|
||||
@Bean |
||||
public KeyGenerator customKeyGenerator() { |
||||
return new SomeCustomKeyGenerator(); |
||||
} |
||||
|
||||
@Bean |
||||
public CacheManager customCacheManager() { |
||||
return CacheTestUtils.createSimpleCacheManager("testCache"); |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue