2010-05-19 4 views
0

프로젝트 코드에서 병목을 다시 쓰는 중입니다. 그래서 자신을 채우는 Ehcache가 포함 된 최상위 항목을 만듭니다. 기본 호출 체인이 설정되었는지 확인하기 위해 테스트를 작성하려고 시도하지만 캐시에서 항목을 검색 할 때 테스트가 실행될 때이를 수행하려고합니다.Ehcache가 테스트에서 멈 춥니 다

다음
@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); 
} 
참조 조롱가 Mockito로 수행되고를 위해 여기

은 설치 및 테스트입니다

답변

0

잠시 후 레슬링을 한 후 캐시가 초기화되지 않은 것을 발견했습니다. CacheManager를 생성하고 캐시를 추가하면 문제가 해결됩니다.

0

안녕하세요 - 세계 예제 에서뿐만 아니라, 나는 또한 EHCache 교수형에 문제가있었습니다. 이것을 끝에 추가하면 응용 프로그램이 정상적으로 종료됩니다.

CacheManager.getInstance().removeAllCaches(); 

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

관련 문제