2010-05-19 14 views
0

Je suis en train de réécrire un goulot d'étranglement dans le code du projet sur lequel je me trouve, et ce faisant je crée un article de haut niveau qui contient un Ehcache auto-peuplé. J'essaie d'écrire un test pour m'assurer que la chaîne d'appel de base est établie, mais quand le test l'exécute, il doit se débrouiller lors de la récupération de l'élément du cache.Ehcache se bloque dans le test

Voici la configuration et le test, pour moqueuse de référence est fait avec 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; 
    } 
} 

Voici le 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; 
    } 
} 

Et voici le 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); 
} 

Répondre

0

Après avoir lutté avec lui pendant un moment, j'ai découvert que le cache n'était pas initialisé. Créer un CacheManager et y ajouter le cache a résolu le problème.

0

J'ai également eu un problème avec EHCache suspendu, bien que seulement dans un exemple de bonjour. Ajouter ceci à la fin l'a corrigé (l'application se termine normalement).

CacheManager.getInstance().removeAllCaches(); 

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