2014-06-19 1 views
0

내에서 어떻게 유닛 테스트 ListenableFuture 나는이 같은 Guava LoadingCache을 사용하고 있습니다 :구아바 LoadingCache : CacheLoader

@Inject 
private ExecutorService executorService; 

private LoadingCache<CacheKey, ResponseEntity<String>> constructCache() { 
    return CacheBuilder.newBuilder() 
     .maximumSize(100) 
     .expireAfterWrite(15, TimeUnit.MINUTES) 
     .build(
      new CacheLoader<CacheKey, ResponseEntity<String>>() { 
       @Override 
       public ResponseEntity<String> load(CacheKey cacheKey) throws Exception { 
        return loadResource(cacheKey); 
       } 
       @Override 
       public ListenableFuture<ResponseEntity<String>> reload(final CacheKey cacheKey, ResponseEntity<String> old) { 
        ListenableFutureTask<ResponseEntity<String>> task = ListenableFutureTask.create(new Callable<ResponseEntity<String>>() { 
         @Override 
         public ResponseEntity<String> call() throws Exception { 
          // this line here! 
          return loadResource(cacheKey); 
         } 
        }); 
        executorService.execute(task); 
        return task; 
       } 
      } 
     ); 
} 

private ResponseEntity<String> loadResource(CacheKey cacheKey) { 
    // ... 
    // external call 
    // ... 
} 

내가 제외한 모든 라인을 테스트 할 수 있습니다. Runnable 작업 내에서 단위 테스트 라인 return loadResource(cacheKey)을 어떻게 테스트합니까? 지금 비동기 새로 고침이 실제로 일어나고 있는지 확인하기 위해 executorService를 조롱하고 있습니다.

답변

0

ExecutorService을 조롱하는 경우 ArgumentCaptor을 사용하면 ListenableFutureTask이 전달됩니다. 작업에 call 메서드를 실행하고 loadResource이 호출되었는지 확인하십시오.

2

ExecutorService을 조롱하는 대신 sameThreadExecutor을 사용하면 작업이 즉시 실행됩니다.

관련 문제