2010-05-19 2 views
0

Я занимаюсь переписыванием шеи бутылки в коде проекта, в котором я состою, и при этом я создаю элемент верхнего уровня, который содержит самонаполняющийся Ehcache. Я пытаюсь написать тест, чтобы убедиться, что базовая цепочка вызовов установлена, но когда тест выполняет его руками при извлечении элемента из кеша.Ehcache висит в тесте

Вот настройка и тест, для справки насмешливый делается с Mockito:

@Before 
public void SetUp() 
{ 
    testCache = new Cache(getTestCacheConfiguration()); 
    recordingFactory = new EntryCreationRecordingCache(); 
    service = new Service<Request, Response>(testCache, recordingFactory); 
} 

@Test 
public void retrievesResultsFromSuppliedCache() 
{ 
    ResultType resultType = mock(ResultType.class); 
    Response expectedResponse = mock(Response.class); 
    addToExpectedResults(resultType, expectedResponse); 
    Request request = mock(Request.class); 
    when(request.getResultType()).thenReturn(resultType); 

    assertThat(service.getResponse(request), sameInstance(expectedResponse)); 
    assertTrue(recordingFactory.requestList.contains(request)); 
} 

private void addToExpectedResults(ResultType resultType, 
     Response response) { 
    recordingFactory.responseMap.put(resultType, response); 

} 

private CacheConfiguration getTestCacheConfiguration() { 
    CacheConfiguration cacheConfiguration = new CacheConfiguration("TEST_CACHE", 10); 
    cacheConfiguration.setLoggingEnabled(false); 
    return cacheConfiguration; 
} 

private class EntryCreationRecordingCache extends ResponseFactory{ 

    public final Map<ResultType, Response> responseMap = new ConcurrentHashMap<ResultType, Response>(); 
    public final List<Request> requestList = new ArrayList<Request>(); 

    @Override 
    protected Map<ResultType, Response> generateResponse(Request request) { 
     requestList.add(request); 
     return responseMap; 
    } 
} 

Вот ServiceClass

public class Service<K extends Request, V extends Response> { 

    private Ehcache cache; 

    public Service(Ehcache cache, ResponseFactory factory) { 
     this.cache = new SelfPopulatingCache(cache, factory); 
    } 

    @SuppressWarnings("unchecked") 
    public V getResponse(K request) 
    { 
     ResultType resultType = request.getResultType(); 
     Element cacheEntry = cache.get(request); 
     V response = null; 
     if(cacheEntry != null){ 
      Map<ResultType, Response> resultTypeMap = (Map<ResultType, Response>) cacheEntry.getValue(); 
      try{ 
       response = (V) resultTypeMap.get(resultType); 
      }catch(NullPointerException e){ 
       throw new RuntimeException("Result type not found for Result Type: " + resultType); 
      }catch(ClassCastException e){ 
       throw new RuntimeException("Incorrect Response Type for Result Type: " + resultType); 
      } 
     } 
     return response; 
    } 
} 

А вот ResponseFactory:

public abstract class ResponseFactory implements CacheEntryFactory{ 

    @Override 
    public final Object createEntry(Object request) throws Exception { 
     return generateResponse((Request)request); 
    } 

    protected abstract Map<ResultType,Response> generateResponse(Request request); 
} 

ответ

0

После долгой борьбы я обнаружил, что кеш не инициализирован. Создание CacheManager и добавление к нему кеша устранили проблему.

0

У меня также была проблема с подвеской EHCache, хотя и только в приветственном мире. Добавляем это до конца, фиксируя его (приложение заканчивается нормально).

CacheManager.getInstance().removeAllCaches(); 

https://stackoverflow.com/a/20731502/2736496