Завершение работы Ehcache, вызывающее исключение при запуске набора тестов

Я испытываю следующую проблему.

У меня есть тестовый костюм в моем проекте, и каждый отдельный тест проходит нормально.

Однако, когда я запускаю их как набор, у некоторых из них происходит сбой, за исключением следующего:

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)

Есть ли способ избежать такого поведения, то есть поддерживать кэш в течение нескольких тестов или правильно его выключать?

5 ответов

Решение

Попытаться установить для общего свойства значение false в EhCacheManagerFactoryBean или же EhCacheCacheManager в контексте тестирования.

Создайте отдельную конфигурацию кэша только для тестов! и поставить область "прототип"

@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;
 }
}

Аннотируйте свой неудачный тестовый класс с помощью @AutoConfigureCache. По умолчанию эта аннотация установит NoOpCacheManager, т.е. базовая, без операции CacheManagerреализация, подходящая для отключения кэширования, обычно используемая для резервного копирования объявлений кэша без фактического резервного хранилища. Он просто примет любые элементы в кеш, фактически не сохраняя их.

Spring Документация по @AutoConfigureCache

Spring Документация по @NoOpCacheManager

Эта проблема возникает в основном всякий раз, когда вы кэшируете между несколькими приложениями. Поэтому постарайтесь не делиться кешем, задав для общего свойства значение 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" />

Я надеюсь, что, наконец, проблема будет решена.

JUnit делится весенним контекстом на скорость. Я избегаю этого исключения, когда удаляю явно закрытие контекста Spring в одном из моих тестов. См. Повторное использование контекста приложения Spring в тестовых классах junit.

Другие вопросы по тегам