I'm experiencing the following problem.
I have a test suit in my project and each individual test runs fine.
However when I run them as a suite I some of them fails with the following exception:
Caused by: java.lang.IllegalStateException: The dao Cache is not alive (STATUS_SHUTDOWN)
at net.sf.ehcache.Cache$CacheStatus.checkAlive(Cache.java:4269)
at net.sf.ehcache.Cache.checkStatus(Cache.java:2703)
at net.sf.ehcache.Cache.get(Cache.java:1576)
at org.springframework.cache.ehcache.EhCacheCache.get(EhCacheCache.java:61)
at org.springframework.cache.interceptor.CacheAspectSupport.inspectCacheables(CacheAspectSupport.java:310)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:198)
at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
Is there a way to avoid this behavior, i.e. keep the cache alive across multiple test or shutting it down properly?
try to set shared property to false in EhCacheManagerFactoryBean
or EhCacheCacheManager
in the testing context.
Make a seperate cache config for tests only! and put scope "prototype"
@Configuration
@EnableCaching
public class EhCacheConfig {
@Bean(name = "cacheManager")
@Scope("prototype")
public CacheManager getCacheManager() {
return new EhCacheCacheManager(getEhCacheFactory().getObject());
}
@Bean
@Scope("prototype")
public EhCacheManagerFactoryBean getEhCacheFactory() {
EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
factoryBean.setShared(true);
return factoryBean;
}
}
This issue occurs basically, Whenever you Cache shared among multiple applications. So try not to share your cache by setting shared property to false.
<spring:bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <spring:property name="configLocation" value="classpath:ehcache.xml" /> <spring:property name="shared" value="false" /> </spring:bean>
But on execution you will encounter
Another CacheManager with same name 'cacheManager' already exists in the same VM. IllegalStateException
To counter this we need to mention
<spring:property name="cacheManagerName" value="abc" />
I hope finally issue will be resolved.
JUnit share Spring context for speed.
I've avoid from this exception when remove explicitly Spring context closing in one of my test. See Reuse spring application context across junit test classes