Ответ 1
попытайтесь установить общее свойство в false в EhCacheManagerFactoryBean
или EhCacheCacheManager
в контексте тестирования.
У меня возникла следующая проблема.
У меня есть тестовый костюм в моем проекте, и каждый отдельный тест работает нормально.
Однако, когда я запускаю их как набор, некоторые из них не работают со следующим исключением:
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)
Есть ли способ избежать этого поведения, т.е. сохранить кеш в нескольких тестах или закрыть его правильно?
попытайтесь установить общее свойство в false в EhCacheManagerFactoryBean
или EhCacheCacheManager
в контексте тестирования.
Создайте отдельную конфигурацию кеша только для тестов! и поместите область "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;
}
}
JUnit поделиться контекстом Spring для скорости. Я избегаю этого исключения, когда явно удаляет контекст Spring в одном из моих тестов. См. Повторное использование контекста приложения Spring в классах классов junit
Эта проблема возникает в основном: всякий раз, когда вы используете кэш для нескольких приложений. Поэтому постарайтесь не делиться кешем, установив для общего свойства значение 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>
Но при выполнении вы столкнетесь
Другой CacheManager с таким же именем cacheManager уже существует в той же виртуальной машине. IllegalStateException
Чтобы противостоять этому, мы должны упомянуть
<spring:property name="cacheManagerName" value="abc" />
Я надеюсь, что наконец проблема будет решена.